内核模块编程 Hello Kernel
在看“<
怎么回事?
后来才发现,这本Linux程序设计入门经典所用的内核是2.4版本 。
而2.6版本内核模块编程部分发生了比较大的变化 。
具体变化可以查看/usr/src/linux/Documentation/kbuild下的几篇文章 。
里面详细说明了2.6内核kbuild和makefile的格式 。
下面就介绍这个内核模块实验hello kernel如何正确运行,希望国内早点翻译<
我所使用的系统为Debian5,内核版本为2.6.26-2-686 。
首先安装kernel headers,以提供相关文件编译内核模块
$ sudo apt-get install linux-headers-`uname -r`
hello.c内容如下
$ cat hello.c
#include
#include
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
【内核模块编程 Hello Kernel】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|
;
推荐阅读
- 关于Linux操作系统内核中的指针和错误值
- Linux内核bootsplash功能的实现方法介绍
- 内核升级后 出现initramfs错误问题解决
- 利用shell编程实现DOS风格的Linux命令行
- 共三种方法 在内核2.6.0-test中安装最新驱动NVIDIA 1.0-4620
- Linux内核模块和驱动的编写
- Linux 内核的类型
- 入门:Linux 2.6 内核的嵌入式系统应用
- Linux内核2.6 的来龙去脉
- Linux操作系统内核的时钟中断机制