在看“<<Linux軌范設(shè)計 第3版>> 第18章 設(shè)備驅(qū)動軌范”時,發(fā)現(xiàn)第621頁的內(nèi)核模塊嘗試無法經(jīng)由過程。 怎么回事? 后來才發(fā)現(xiàn),這本Linux軌范設(shè)計入門經(jīng)典所用的內(nèi)核是2.4版本。 而2.6版本內(nèi)核模塊編程部門發(fā)生了斗勁年夜的轉(zhuǎn)變。 具體轉(zhuǎn)變可以查看/usr/src/linux/Documentation/kbuild下的幾篇文章。 瑯縵沔具體說了然2.6內(nèi)核kbuild和makefile的名目。 下面就介紹這個內(nèi)核模塊嘗試hello kernel若何正確運(yùn)行,但愿國內(nèi)早點(diǎn)翻譯<<Linux軌范設(shè)計 第4版>> 我所使用的系統(tǒng)為Debian5,內(nèi)核版本為2.6.26-2-686。 首先安裝kernel headers,以供給相關(guān)文件編譯內(nèi)核模塊 $ sudo apt-get install linux-headers-`uname -r` hello.c內(nèi)容如下 $ 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內(nèi)核核核採用module_init()和module_exit()庖代static __init int init_module(void)和static __exit void cleanup_module(void)函數(shù)。 Makefile內(nèi)容如下 $ 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為內(nèi)核模塊,obj-k則為編譯到內(nèi)核。 寫好hello.c和Makefile,接著運(yùn)行make呼吁,編譯自己寫的內(nèi)核模塊 $ 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呼吁查看內(nèi)核緩沖區(qū),并用tail查看最后一條信息 $ dmesg | tail -1 [24477.822683] Hello, kernel! 列出模塊清單,查找hello模塊 $ lsmod | grep hello hello 1216 0 移除hello模塊 $ sudo rmmod hello 用dmesg呼吁查看內(nèi)核緩沖區(qū),并用tail查看最后一條信息 $ dmesg | tail -1 [24530.986833] Good-bye, kernel! $ 成功了! Hello Kernel |o| |
|