标签: linux-kernel

如何从C中的函数指针获取函数的名称?

如何从C中的函数指针获取函数的名称?

编辑:真实情况是:我正在编写一个Linux内核模块,我正在调用内核函数.其中一些函数是指针,我想检查内核源代码中该函数的代码.但我不知道它指向哪个功能.我认为可以这样做,因为当系统出现故障(内核崩溃)时,它会在屏幕上打印出具有函数名称的当前callstack.但是,我想我错了......是吗?

c function-pointers linux-kernel

56
推荐指数
4
解决办法
6万
查看次数

特权容器和功能

如果我在特权模式下运行容器,它是否具有所有内核功能,还是需要单独添加它们?

linux-kernel docker linux-capabilities kubernetes

56
推荐指数
3
解决办法
7万
查看次数

x86中的IN&OUT指令用于什么?

在阅读"理解Linux内核"一书的同时,我已经在IN&OUT中遵循了这些指令.我查阅了参考手册.

5.1.9 I/O指令

这些指令在处理器的I/O端口和寄存器或存储器之间移动数据.

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
Run Code Online (Sandbox Code Playgroud)

我没有得到一些东西:

  1. "处理器的I/O端口".这些是什么?为什么我们要在这些端口上读取和写入"字符串"?
  2. 我从来没有遇到过需要使用这些说明的场景.我什么时候需要这些?
  3. 举一些实际的例子.

x86 assembly linux-kernel

55
推荐指数
5
解决办法
7万
查看次数

可以使用多少内存

我阅读了文档Understanding Virtual Memory,它说在Linux VM中更改可调参数的一种方法是命令:

sysctl -w vm.max_map_count=65535
Run Code Online (Sandbox Code Playgroud)

我想知道数字65535的含义以及设置可以使用多少内存.

linux-kernel

53
推荐指数
3
解决办法
7万
查看次数

Qt Creator,ptrace:不允许操作.什么是永久解决方案?

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)

c++ qt linux-kernel linux-mint qt5

53
推荐指数
3
解决办法
3万
查看次数

Linux内核实时调试,它是如何完成的以及使用了什么工具?

用于在Linux内核上进行实时调试的最常见和不常见的方法和工具是什么?我知道Linus比如说.为防止这种调试Linux内核,或者至少是,因此什么都没有在这个意义上在这些年已经完成,但老实说,自2000年以来大量的时间已经过去了,我很感兴趣,如果这种心态已经改变了有关Linux的项目以及目前使用哪些方法在Linux内核上进行实时调试(本地或远程)?

欢迎参考有关所提及的技术和工具的演练和教程.

linux debugging kernel linux-kernel

52
推荐指数
6
解决办法
4万
查看次数

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是固件加载的方式.从udev93 开始,这个程序被替换为一个名为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_firmwarefirmware_helper查看$FIRMWARE …

firmware linux-device-driver linux-kernel

51
推荐指数
2
解决办法
7万
查看次数

为什么有些内核程序员使用goto而不是简单的while循环?

当我学习C语言时,老师终日告诉我:"不要使用goto,这是一个坏习惯,它很丑,很危险!" 等等.

那么,为什么一些内核程序员会使用goto,例如在这个函数中,它可以用一个简单的替换

while(condition) {} 
Run Code Online (Sandbox Code Playgroud)

要么

do {} while(condition);
Run Code Online (Sandbox Code Playgroud)

我无法理解.在某些情况下使用goto而不是while/ do- 更好while吗?如果是这样,为什么?

c linux loops goto linux-kernel

51
推荐指数
2
解决办法
1万
查看次数

准确计算Linux中以百分比给出的CPU使用率?

这是一个多次被问过的问题,但是我找不到很好的支持答案.

许多人建议使用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总是与一起增加niceuser(所以他们不应该被包含在CPU使用率计算,因为它们包含在niceuser领域已经)

/*
 * 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 cpu calculator cpu-usage linux-kernel

51
推荐指数
3
解决办法
6万
查看次数

冷缓存和热缓存概念是什么意思?

我读报纸,它使用的术语冷缓存温暖的高速缓存.我搜索了这个术语,但我没有找到有用的东西(这里只有一个帖子).

这些术语是什么意思?

filesystems caching ext2 linux-kernel

50
推荐指数
3
解决办法
3万
查看次数