一个内核模块单独是不可执行的,但目标文件在运行时被连接进内核。因此,在编译时要使用 -c 标记. 而且, 所有的内核模块必须结合特定的定义过的符号进行编译。
还有其他一些需要或不需要包括的符号,这取决于内核用什么标记编译。如果你不能确定内核是如何编译的, 请查看 /usr/include/linux/config.h
# 为基本的内核模块写的Make文件 CC=gcc MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX hello.o: hello.c /usr/include/linux/version.h $(CC) $(MODCFLAGS) -c hello.c echo insmod hello.o to turn it on echo rmmod hello to turn if off echo echo X and kernel programming do not mix. echo Do the insmod and rmmod from outside X.
因此,现在唯一剩下的事情就是su 为root用户 (你不能作为root用户编译,对吗? 生活在边缘1.1...), 然后insmod hello 和 rmmod hello 到你的系统核心. 当你完成这个,注意 /proc/modules中的新内核模块。
顺便说一下,之所以推荐不要在 X下做insmod是因为当内核用printk打印消息时它将消息发送到 控制台。当你不使用 X, 它就发往你正在使用的虚拟终端(你用Alt-F<n>选定的那个) 而使你可以看见。 另一方面,当你使用 X, 有两种可能。要么你有一个用xterm -C打开的终端,在这种情况下输出将被发送到 那儿;或者你没有打开终端,在这种情况下输出被发往被X“隐蔽”的虚拟终端7。
如果你的内核变得不稳定,不用X得到调试信息更有可能。在X之外printk 直接从内核打印到控制台。另一方面,在X下,printk变成用户模式进程 (xterm -C). 当该进程正占用CPU,它被假设发往X服务进程,然后,当X服务进程占用 CPU, 它被假设去显示该信息 --但是一个不稳定的内核通常意味着崩溃或重新启动然而你不想延迟得到错误信息, 这也许可以向你解释什么地方出错了。