如何从C中的函数指针获取函数的名称?
编辑:真实情况是:我正在编写一个Linux内核模块,我正在调用内核函数.其中一些函数是指针,我想检查内核源代码中该函数的代码.但我不知道它指向哪个功能.我认为可以这样做,因为当系统出现故障(内核崩溃)时,它会在屏幕上打印出具有函数名称的当前callstack.但是,我想我错了......是吗?
如果我在特权模式下运行容器,它是否具有所有内核功能,还是需要单独添加它们?
在阅读"理解Linux内核"一书的同时,我已经在IN&OUT中遵循了这些指令.我查阅了参考手册.
5.1.9 I/O指令
这些指令在处理器的I/O端口和寄存器或存储器之间移动数据.
Run Code Online (Sandbox Code Playgroud)IN Read from a port OUT Write to a port INS/INSB Input string from port/Input byte string from port INS/INSW Input string from port/Input word string from port INS/INSD Input string from port/Input doubleword string from port OUTS/OUTSB Output string to port/Output byte string to port OUTS/OUTSW Output string to port/Output word string to port OUTS/OUTSD Output string to port/Output doubleword string to port
我没有得到一些东西:
我阅读了文档Understanding Virtual Memory,它说在Linux VM中更改可调参数的一种方法是命令:
sysctl -w vm.max_map_count=65535
Run Code Online (Sandbox Code Playgroud)
我想知道数字65535的含义以及设置可以使用多少内存.
C++
在Qt创建器中调试代码时,我收到以下错误
ptrace: Operation not permitted.
Could not attach to the process. Make sure no other debugger traces this process.
Check the settings of
/proc/sys/kernel/yama/ptrace_scope
For more details, see /etc/sysctl.d/10-ptrace.conf
Run Code Online (Sandbox Code Playgroud)
这里找到了一个临时解决方案:尝试在QtProject中调试时收到错误
临时解决方案(无法重启):
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
但是每次启动PC使用Qt时,很难在终端中运行相同的代码.
What is the permanent solution for this?
Run Code Online (Sandbox Code Playgroud) 用于在Linux内核上进行实时调试的最常见和不常见的方法和工具是什么?我知道Linus比如说.为防止这种调试Linux内核,或者至少是,因此什么都没有在这个意义上在这些年已经完成,但老实说,自2000年以来大量的时间已经过去了,我很感兴趣,如果这种心态已经改变了有关Linux的项目以及目前使用哪些方法在Linux内核上进行实时调试(本地或远程)?
欢迎参考有关所提及的技术和工具的演练和教程.
我正在Ubuntu下编译一个自定义内核,我遇到了我的内核似乎不知道在哪里寻找固件的问题.在Ubuntu 8.04下,固件与内核版本绑定的方式与驱动程序模块相同.例如,内核2.6.24-24-generic将其内核模块存储在:
/lib/modules/2.6.24-24-generic
Run Code Online (Sandbox Code Playgroud)
及其固件:
/lib/firmware/2.6.24-24-generic
Run Code Online (Sandbox Code Playgroud)
当我根据" 备用构建方法:老式Debian方式 " 编译2.6.24-24通用Ubuntu内核时,我得到了相应的模块目录,除了需要固件的设备外,我的所有设备都工作,例如我的英特尔无线网卡(ipw2200)模块).
内核日志显示,例如,当ipw2200尝试加载固件时,控制固件加载的内核子系统无法找到它:
ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
Run Code Online (Sandbox Code Playgroud)
errno-base.h将此定义为:
#define ENOENT 2 /* No such file or directory */
Run Code Online (Sandbox Code Playgroud)
(返回ENOENT的函数在它前面放一个减号.)
我尝试在/ lib/firmware中创建一个符号链接,其中我的内核名称指向2.6.24-24-generic目录,但是这导致了同样的错误.此固件是非GPL,由Intel提供并由Ubuntu打包.我不相信它与特定内核版本有任何实际联系.cmp
表明各个目录中的版本是相同的.
那么内核如何知道在哪里寻找固件呢?
更新
我找到了解决我遇到的确切问题的解决方案,但是它不再有效,因为Ubuntu已经淘汰/etc/hotplug.d
并且不再存储其固件/usr/lib/hotplug/firmware
.
UPDATE2
更多的研究提出了更多的答案.直到版本92 udev
,该程序firmware_helper
是固件加载的方式.从udev
93 开始,这个程序被替换为一个名为firmware.sh的脚本,据我所知,它提供了相同的功能.这两个硬编码固件路径/lib/firmware
.Ubuntu似乎仍在使用/lib/udev/firmware_helper
二进制文件.
固件文件的名称将传递到firmware_helper
环境变量中$FIRMWARE
,该变量连接到路径/lib/firmware
并用于加载固件.
加载固件的实际请求是由驱动程序(在我的情况下为ipw2200)通过系统调用完成的:
request_firmware(..., "ipw2200-bss.fw", ...);
Run Code Online (Sandbox Code Playgroud)
现在,在驱动程序调用request_firmware
和firmware_helper
查看$FIRMWARE …
当我学习C语言时,老师终日告诉我:"不要使用goto,这是一个坏习惯,它很丑,很危险!" 等等.
那么,为什么一些内核程序员会使用goto
,例如在这个函数中,它可以用一个简单的替换
while(condition) {}
Run Code Online (Sandbox Code Playgroud)
要么
do {} while(condition);
Run Code Online (Sandbox Code Playgroud)
我无法理解.在某些情况下使用goto而不是while
/ do
- 更好while
吗?如果是这样,为什么?
这是一个多次被问过的问题,但是我找不到很好的支持答案.
许多人建议使用top命令,但如果你运行top一次(因为你有一个脚本,例如每1秒收集一次Cpu使用),它将始终给出相同的Cpu使用结果(例1,例2).
计算CPU使用率的更准确方法是从中读取值/proc/stat
,但大多数答案仅使用前4个字段/proc/stat
来计算它(此处为一个示例).
/proc/stat/
从Linux内核2.6.33开始,每CPU核心有10个字段!
我还使用/ proc/stat问题在Linux中找到了这个准确计算CPU利用率的问题,该问题指出了同样的问题 - 大多数其他问题只考虑了许多领域中的4个问题 - 但这里给出的答案仍然是"我在认为"(不确定),除此之外,它只关注前7个领域(满分为10个/proc/stat/
)
这个 perl脚本使用所有字段来计算CPU使用率,经过一些进一步的调查后我再也认为这是不正确的.
采取快速查找到内核代码后在这里,它看起来像,例如,guest_nice
并且guest fields
总是与一起增加nice
和user
(所以他们不应该被包含在CPU使用率计算,因为它们包含在nice
和user
领域已经)
/*
* Account guest cpu time to a process.
* @p: the process that the cpu time gets accounted to
* @cputime: the cpu time spent in virtual machine since the last update …
Run Code Online (Sandbox Code Playgroud) 我读报纸,它使用的术语冷缓存和温暖的高速缓存.我搜索了这个术语,但我没有找到有用的东西(这里只有一个帖子).
这些术语是什么意思?
linux-kernel ×10
linux ×3
c ×2
assembly ×1
c++ ×1
caching ×1
calculator ×1
cpu ×1
cpu-usage ×1
debugging ×1
docker ×1
ext2 ×1
filesystems ×1
firmware ×1
goto ×1
kernel ×1
kubernetes ×1
linux-mint ×1
loops ×1
qt ×1
qt5 ×1
x86 ×1