为什么我的“hello world”驱动程序模块没有输出任何内容?

6
我是一个新手,对内核模块编程一窍不通。现在我正在尝试运行最基本的“Hello World”模块程序,但我无法得到任何输出。
我已经按照《Linux设备驱动程序》第三版介绍的方法编写了“Hello World”程序,并从这个网站那个网站获得了一些帮助。

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 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方面也缺乏经验,因此解释性答案更受欢迎。我做错了什么吗?为什么我看不到任何输出?


1
你在dmesg中有任何输出吗? - terdon
当我使用 cat dmesg 命令时,看到了很多内容,但是没有关于该模块的任何信息。我认为它应该在文件末尾,但是不仅不在末尾,也不在中间或开头。 - Varaquilex
然而,cat kern.log 做了这件事: 12月9日18:42:46 Varaquilex kernel:[2314.937815] <1>你好,世界! 12月9日18:42:49 Varaquilex kernel:[2317.873400] 再见,世界.. - Varaquilex
1个回答

5
内核消息被记录在位于/var/log中的kern.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..

2
请注意,它们不一定在那里;这是在/etc/syslog.conf中确定的(但首先查找/etc/rsyslog.conf,如果存在,则优先)。您将在该文件中找到有关kern.log的一些参考信息。您还会注意到优先级(1 = alert等)在那里使用。奇怪的是,这最终没有出现在dmesg中。 - CodeClown42
嗯——注意<1>Hello, world!。我想API自从你的参考文献编写以来已经有所改变,这可能不是首要处理的内容,因此使用默认值。无论如何都有些事情需要调查一下。 - CodeClown42
我查看了 rsyslog.conf,没有任何关于 kern.log 的相关信息。当我搜索 kern 时,只有一行匹配:$ModLoad imklog # provides kernel logging support。也许这就是对 kern.log 文件的引用? - Varaquilex
也许,尽管指令应该仍然是指令;可能imklog包含其自己的默认值(虽然此处使用了相同的模块,但我没有/var/log/kern.log...)。可能还有一个/etc/rsyslog.d/目录,其中包含由rsyslog.conf包含的内容;这些文件可能包含很多或很少。 - CodeClown42
还有一种可能是:你的系统实际上并没有使用 rsyslogd,可以尝试运行 ps -A | grep syslog 命令,你会得到 syslogd 或者 rsyslogd。它们使用不同的配置文件(因此 /etc/syslog.conf 不同)。 - CodeClown42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接