第一个内核程序"Hello World"

内核模块可以用insmod来动态加载,用rmmod来动态卸载.与应用层编程的不同在于,内核模块需要一个

初始化函数和一个清理函数,在向内核加载模块的时候调用初始化函数,卸载模块的时候调用清理函数.与

传统把函数编译进内核相比,通过模块的形式大大提高了开发的效率.

下面是内核版本的Hello World,先看代码

[code]
#include <linux/module.h>
#include <linux/init.h>

/* License, Author, Description, Version .etc declared*/
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("firefoxbug);
MODULE_DESCRIPTION("Hello World DEMO");
MODULE_VERSION("0.0.1");
MODULE_ALIAS("test");

/* Init the module */
static int helloworld_init(void)
{
printk(KERN_ALERT "Hello world module init\n");

return 0;
}

/* clear the module */
static void helloworld_exit(void)
{
printk(KERN_ALERT "Hellow world module exit\n");
}

module_init(helloworld_init);
module_exit(helloworld_exit);

[/code]

再来看看 Makefile 文件

[code]
########Makefile

test = hello_world
obj-m := $(test).o
KERNELDIR = /lib/modules/`uname -r`/build
PWD = `pwd`
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
install:
insmod $(test).ko
uninstall:
rmmod $(test).ko
clean:
rm -rf *.o *.mod.c *.ko
rm -rf Module.symvers .*cmd .tmp_versions
[/code]

执行 make 命令编译,make install会调用 insmod 来加载模块,同样 make clean 调用 rmmod 来卸载模块

所以必须要 root 权限!下面是我在编译过程中遇到的问题,当然都是基于不同的内核版本的.

[code]
[root@firefoxbug firefoxbug]# ll /lib/modules/`uname -r`/build
lrwxrwxrwx. 1 root root 38 Nov 8 15:31 /lib/modules/3.6.5-2.fc16.i686/build -> /usr/src/kernels/3.6.5-2.fc16.i686
#这时候进入到/usr/src/kernels/会发现没有内核目录树
#yum install kernel-devel ==>> 就会下载相关的目录树
[/code]

在编译的过程中还可能会出现 /lib/modules/`uname -r`/build 对应的链接目录不对应,得修改.目前我个人

的电脑也碰到一个问题,我编译通过了,但是在 insmod 的时候提示

[code]
[root@firefoxbug hello_kernel]# insmod hello_world.ko
insmod: error inserting 'hello_world.ko': -1 Invalid module format
[root@firefoxbug hello_kernel]# dmesg
.....
[ 4326.369892] hello_world: version magic '3.6.5-2.fc16.i686 SMP mod_unload 686 ' should be '3.6.5-2.fc16.i686.PAE SMP mod_unload 686 '
[/code]

后来我换了一个CentOS,然后安装 kernel-devel 编译,加载,卸载都OK.

标签:Linux, Kernel

评论已关闭