万卷书   首页 > 电脑书籍 > Linux >Linux内核模块编程指南(一)
 
内核模块的Make文件

  一个内核模块单独是不可执行的,但目标文件在运行时被连接进内核。因此,在编译时要使用 -c 标记. 而且, 所有的内核模块必须结合特定的定义过的符号进行编译。

__KERNEL__ -- 这个符号告诉头文件这些代码将在内核模式运行,不要当作用户进程的一部分。

MODULE -- 这个符号告诉头文件为内核模块给出适当的定义。

LINUX -- 从技术上说这不是必要的。然而,如果你曾经想过写一系列要在不止一个的操作系统 上编译的内核模块,那么你将为你在这所做的高兴。这将允许你条件编译平台独立性的部分。
还有其他一些需要或不需要包括的符号,这取决于内核用什么标记编译。如果你不能确定内核是如何编译的,请查看 /usr/include/linux/config.h

__SMP__ -- Symmetrical MultiProcessing(对称多处理). 如果内核被编译为支持对称多处理 (即使它仅仅运行于单CPU上),这个符号必须包含.如果你使用对称多处理,你还有很多其他的事情需要 做(参看第12章).

CONFIG_MODVERSIONS -- 如果CONFIG_MODVERSIONS 被激活, 你需要使它在编译内核模块时已定义 并且包含/usr/include/linux/modversions.h. 这也可以比、被代码自己完成。

范例 Makefile

# 为基本的内核模块写的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选定的那个) 而使你可以看见。另一方面,当你使用 X, 有两种可能。要么你有一个用xterm -C打开的终端,在这种情况下输出将被发送到那儿;或者你没有打开终端,在这种情况下输出被发往被X“隐蔽”的虚拟终端7。

  如果你的内核变得不稳定,不用X得到调试信息更有可能。在X之外printk 直接从内核打印到控制台。另一方面,在X下,printk变成用户模式进程 (xterm -C). 当该进程正占用CPU,它被假设发往X服务进程,然后,当X服务进程占用 CPU, 它被假设去显示该信息 --但是一个不稳定的内核通常意味着崩溃或重新启动然而你不想延迟得到错误信息,这也许可以向你解释什么地方出错了。

上一页 下一页