萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> 內核模塊編程 Hello Kernel

內核模塊編程 Hello Kernel

class="152526">

在看“<<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.chello.mod.c; hello.omake.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
hello1216; 0

移除hello模塊
$ sudo rmmod hello

用dmesg命令查看內核緩沖區,並用tail查看最後一條信息
$ dmesg | tail -1
[24530.986833] Good-bye, kernel!
$

成功了!
Hello Kernel |o|
;

copyright © 萬盛學電腦網 all rights reserved