内核模块编程 Hello Kernel

【字号: 日期:2024-10-12浏览:14作者:雯心

在看“<<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 Makefileobj-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命令,编译自己写的内核模块$ lshello.c; Makefile$ makemake -C /lib/modules/2.6.26-2-686/build M=/home/c-aries/下载/module modules > make.log 2>&1$ lshello.chello.mod.c; hello.omake.log;;;;Module.symvershello.ko; hello.mod.o; Makefile; modules.order

插入hello模块$ sudo insmod hello.ko

用dmesg命令查看内核缓冲区,并用tail查看最后一条信息$ dmesg | tail -1[24477.822683] Hello, kernel!

列出模块清单,查找hello模块$ lsmod | grep hellohello1216; 0

移除hello模块$ sudo rmmod hello

用dmesg命令查看内核缓冲区,并用tail查看最后一条信息$ dmesg | tail -1[24530.986833] Good-bye, kernel!$

成功了!Hello Kernel |o|;

相关文章: