在看“<<Linux轨范设计 第3版>> 第18章 设备驱动轨范”时,发现第621页的内核模块尝试无法经由过程。 怎么回事? 后来才发现,这本Linux轨范设计入门经典所用的内核是2.4版本。 而2.6版本内核模块编程部门发生了斗劲年夜的转变。 具体转变可以查看/usr/src/linux/Documentation/kbuild下的几篇文章。 琅缦沔具体说了然2.6内核kbuild和makefile的名目。 下面就介绍这个内核模块尝试hello kernel若何正确运行,但愿国内早点翻译<<Linux轨范设计 第4版>> 我所使用的系统为Debian5,内核版本为2.6.26-2-686。 首先安装kernel headers,以供给相关文件编译内核模块 $ sudo apt-get install linux-headers-`uname -r` hello.c内容如下 $ cat hello.c #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk("Hello, kernel!n"); return 0; } static void hello_exit(void) { printk("Good-bye, kernel!n"); } module_init(hello_init); module_exit(hello_exit); $ 2.6内核核核採用module_init()和module_exit()庖代static __init int init_module(void)和static __exit void cleanup_module(void)函数。 Makefile内容如下 $ cat Makefile obj-m += hello.o KDIR:=/lib/modules/$(shell uname -r)/build PWD=$(shell pwd) all: make -C $(KDIR) M=$(PWD) modules > make.log 2>&1 clean: make -C $(KDIR) M=$(PWD) clean $ 其中obj-m为内核模块,obj-k则为编译到内核。 写好hello.c和Makefile,接着运行make呼吁,编译自己写的内核模块 $ ls hello.c Makefile $ make make -C /lib/modules/2.6.26-2-686/build M=/home/c-aries/下载/module modules > make.log 2>&1 $ ls hello.c hello.mod.c hello.o make.log Module.symvers hello.ko hello.mod.o Makefile modules.order 插入hello模块 $ sudo insmod hello.ko 用dmesg呼吁查看内核缓冲区,并用tail查看最后一条信息 $ dmesg | tail -1 [24477.822683] Hello, kernel! 列出模块清单,查找hello模块 $ lsmod | grep hello hello 1216 0 移除hello模块 $ sudo rmmod hello 用dmesg呼吁查看内核缓冲区,并用tail查看最后一条信息 $ dmesg | tail -1 [24530.986833] Good-bye, kernel! $ 成功了! Hello Kernel |o| |
|