【问题标题】:linux kernel module not autoloadinglinux内核模块不自动加载
【发布时间】:2015-07-20 09:48:41
【问题描述】:

我正在研究 linux 内核并从 hello world 模块开始,此时一切都很好,但是在编译之后

$ make

并安装

$ insmod akmod.ko

在 KERN_DEBUG 上没有显示“hello world”消息的模块

$ dmesg
nothing here
$

只在 rmmod 上显示

$ rmmod akmod
[4543.3423432] hello world
[5462.5323452] goodbye

代码与此处的代码相同:http://www.makelinux.net/ldd3/chp-2-sect-2

我刚刚将 KERN_ALERT 更改为 KERN_DEBUG

我正在使用 Debian 8。

我认为这是因为它没有在 insmod

上自动加载的模块

当我跑步时

$ make menuconfig

我找不到选项自动加载内核模块

Loadable module support  --->
  [*] Enable loadable module support
  [*]   Module unloading
  [ ]   Module versioning support (EXPERIMENTAL)
  [*]   Automatic kernel module loading **(My menu config don´t show this option)**

任何建议将不胜感激

【问题讨论】:

  • 您正在手动加载它。自动加载与它有什么关系?
  • 我不知道,大声笑,我真的很想了解为什么我的模块只在 rmmod 上显示消息

标签: c linux kernel


【解决方案1】:

有时在发出printk 和在 dmesg 中显示消息之间会有一些延迟。您可以从 dmesg 输出中看到:“hello world”的时间戳比“goodbye”的时间戳少 80 秒。

不知道为什么,但是消息的级别越高,延迟越小。你可以试试 KERN_INFO 甚至 KERN_ALERT。

【讨论】:

  • 感谢您的帮助。
  • 我不相信这是真的。看看 printk 和 dmesg 内部做了什么,它是一个静态分配的内存块,由 printk 立即写入。 dmesg 只是转储内存块。从来没有延误。
【解决方案2】:

您所描述的内容听起来好像您的 printk 末尾没有包含换行符(“\n”)。

由于您没有分享您的实际代码,并且您的 insmod 显然不是来自示例。 (insmod akmod.ko?为什么是 akmod?akmod 是完全不同的东西。)调试这是一个完全的猜测。

【讨论】:

  • 确实我换了一行 (\n) 并在加载时打印消息(使用 KERN_DEBUG)。但是使用@Tyvarev(KERN_INFO 和 KERN_DEBUG)的提示,该消息已打印,没有新行 (\n) 字符。
猜你喜欢
  • 2023-03-20
  • 2016-10-12
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 2012-04-11
相关资源
最近更新 更多