HelloWorld内核
开始断断续续学习内核,大概半年了,多少开始对内核有点感悟了,但是对于这个庞然大物我显得很渺小,在枯燥的内核源码之中似乎没有一点点成功的喜悦,因此我选择学习内核模块编程,通过编写一些内核模块来体验那一点点小小的成就感吧!
什么是内核模块
内核模块是具有独立功能的程序。它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内核空间中运行
最简单的内核模块
#include <linux/module.h> //所有模块都必须包含的头文件
#include <linux/kernel.h> //一些宏定义,例如这里的KERN_INFO
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
/*
* 返回非0表示模块初始化失败,无法载入
*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
//一个模块至少需要两个函数,一个初始化函数这里是init_module在载入内核的时候调用,
//一个结束函数,这里是cleannup_module在从内核中注销的时候调用
一个Makefile来编译这个内核模块
obj-m += hello-1.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
注意:本文所有环节都是基于Centos6.5下测试OK,你可能在有的书上看见Makefile是这样写的
make -C /usr/src/linux-headers-$(shell uname -r) M=$(PWD) modules
其实/lib/modules/$(shell uname -r)/build 这个路径就是上面路径的一个软链接
[root@localhost 2.6.32-431.el6.x86_64]# ls -al build
lrwxrwxrwx. 1 root root 44 Mar 16 05:26 build -> /usr/src/kernels/2.6.32-504.12.2.el6.x86_64/<