【问题标题】:Why doesn't my hello world driver module print anything?为什么我的 hello world 驱动程序模块不打印任何内容?
【发布时间】:2013-12-10 05:03:07
【问题描述】:

我对内核模块编程非常陌生,现在我正在尝试运行最基本的 hello world 模块程序,但是我无法获得任何输出。

我已经编写了 Linux Device Drivers 3rd ed 中介绍的 hello world 程序,并得到了 this websitethis one 的一些帮助。

hello.c

#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");

static int hello_init(void){
    printk("<1>Hello, world!\n");
    return 0;
}

static void hello_exit(void){
    printk(KERN_ALERT "Goodbye, world..\n");
}

module_init(hello_init);
module_exit(hello_exit);

该文件位于/home/volkan/drive 目录中。除了 c 文件,我还有我的 Makefile

生成文件

obj-m += hello.o

从终端,我执行这个命令来编译模块:

sudo make -C /lib/modules/3.8.0-19-generic/build M=/home/volkan/drive/ modules

导致:

make: Entering directory `/usr/src/linux-headers-3.8.0-19-generic'
  CC [M]  /home/volkan/drive/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/volkan/drive/hello.mod.o
  LD [M]  /home/volkan/drive/hello.ko
make: Leaving directory `/usr/src/linux-headers-3.8.0-19-generic'

我认为到目前为止,没有任何问题。现在,我插入我的模块,然后删除:

volkan@Varaquilex ~/drive $ sudo insmod ./hello.ko
volkan@Varaquilex ~/drive $ sudo rmmod hello
volkan@Varaquilex ~/drive $ 

没有输出。我在 linux 方面也没有什么经验,所以非常欢迎解释性的答案。难道我做错了什么?为什么我看不到任何输出?

【问题讨论】:

  • dmesg有输出吗?
  • 当我cat dmesg 看到很多东西,但与模块无关。我认为它应该在文件的末尾,但不仅不在末尾,也不在中间或开头。
  • 然而,cat kern.log 成功了:` 12 月 9 日 18:42:46 Varaquilex 内核:[2314.937815] 你好,世界! 12 月 9 日 18:42:49 Varaquilex 内核:[2317.873400] 再见,世界.. `

标签: c linux-device-driver kernel-module


【解决方案1】:

内核消息记录在位于/var/logkern.log 文件中。根据您的系统,它也可能位于dmesg。所以你必须相应地cat

使用命令cat /var/log/kern.log

Dec  9 18:51:10 Varaquilex kernel: [ 2818.079572] <1>Hello, world!
Dec  9 18:55:02 Varaquilex kernel: [ 3050.256134] Goodbye, world..

【讨论】:

  • 请注意,它们并非必要在那里;这是在/etc/syslog.conf 中确定的(但首先要查找/etc/rsyslog.conf,如果存在则优先)。您会在该文件中找到对kern.log 的一些引用。您还会注意到那里使用了优先级(1 = 警报等)。奇怪的是,这并没有出现在dmesg tho。
  • 嗯——通知&lt;1&gt;Hello, world!。我认为自从您的参考被编写以来,API 已经发生了一些变化,并且可能没有作为优先级处理,因此使用默认值。无论如何都要调查一下。
  • 我查了rsyslog.conf。与kern.log 无关。当我搜索 kern 时,只有 1 行匹配:$ModLoad imklog # provides kernel logging support。也许这是对kern.log 文件的引用?
  • 也许吧,尽管指令应该仍然是指令;可能是imklog 包含它自己的默认值(虽然这里使用了相同的模块,但我没有/var/log/kern.log...)。可能还有一个/etc/rsyslog.d/ 目录,其中包含rsyslog.conf 包含的内容;这些文件可能包含也可能不包含太多内容。
  • 也有可能:您的系统实际上并未使用rsyslogd -- 尝试ps -A | grep syslog,您将得到syslogdrsyslogd。他们使用不同的conf文件(因此/etc/syslog.conf)。
猜你喜欢
  • 1970-01-01
  • 2020-02-03
  • 2015-05-04
  • 1970-01-01
  • 2015-12-04
  • 2011-02-03
  • 2022-01-09
  • 1970-01-01
  • 2019-03-19
相关资源
最近更新 更多