第二步:编译模块
如果你习惯使用老办法来编译内核模块(例如,从#define MODULE开始),就会发现新的方法有很大变化。即使是首次编译2.6的模块,看起来也相当简单。该模块的Makefile文件基本内容如下:
Makefile
002 # Makefile for Linux Kernel Primer module skeleton (2.6.7)
006 obj-m += hellomod.o
要注意的是,需要向编译系统特别声明该模块要编译成可加载模块。该Makefile文件的命令行调用由称为doit的脚本文件来打包,如下所示:
(新建一个脚本文件,并把它的属性改成可执行文件
如:
#vim doit
// doit脚本文件的内容为 make -C /usr/src/linux-2.6.7 SUBDIRS=$PWD modules
// 将 /usr/src/linux-2.6.7 改为本机的内核版本(我的是/usr/src/linux-headers-2.6.22-14-generic)
#chmod 744 doit
)
----------------------------------------------------------------------------doit
001 make -C /usr/src/linux-2.6.7 SUBDIRS=$PWD modules
--------------------------------------------------------------------------------
1行:
C选项告诉make程序读取Makefiles或做其他任何事之前,先要修改Linux源目录(本例中是/usr/src/linux-2.6.7)。
执行./doit后可得到与以下内容类似的输出结果:
Lkp# ./doit
make: Entering directory '/usr/src/linux-2.6.7'
CC [M] /mysource/hellomod.o
Building modules, stage 2
MODPOST
CC /mysource/hellomod.o
LD [M] /mysource/hellomod.ko
make: Leaving directory '/usr/src/linux-2.6.7'
lkp# _
如果在Linux早期的版本上编译过或创建过Linux模块,那么此处还有一个链接步骤LD,其输出模块是hellomod.ko。
第三步:运行代码
现在我们已经准备好,可以将新的模块插入到内核中啦!这可以用命令insmod来实现,如下所示:
(非root用户在使用insmod时,在前面加 sudo,否则会因没有足够权限而无法执行
如:
$sudo insmod hellomod.ko
)
lkp# insmod hellomod.ko
lsmod命令可用于检查模块是否正确插入到内核中了:
lkp# lsmod
Module Size Used by
hellomod 2696 0
lkp#
模块的输出由printk()来产生。该函数默认打印系统文件/var/log/messages的内容。快速浏览这些消息可输入如下命令:
lkp# tail /var/log/messages
(可使用”dmesg”命令来查看,我运行的时候使用”tail /var/log/messages “不能显示下面的信息,因为该初始化信息存储在/var/log/kern.log中 )
这一命令打印日志文件的最后10行内容,可以看到我们的初始化信息:
...
...
Mar 6 10:35:55 lkp1 kernel: Hello,World! from the kernel space...
使用rmmod命令,加上我们在insmod中看到的模块名,可以从内核中移除该模块(还可以看到退出时显示的信息)。如下所示:
lkp# rmmod hellomod
同样,输出的内容也在日志文件中,如下所示:
...
...
Mar 6 12:00:05 lkp1 kernel: Hello,World! from the kernel space...
根据x-系统的配置或者是否有基本命令行,printk的输出可以在终端上显示,也可以存放在日志文件中。在下一个项目中,考虑系统的任务变量时会再提到这个问题。
