加载Linux单体内核的笔记

“Hello world”是一个示例模块(module),文件名是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("byebye\n");
 return;
}


module_init(hello_init);
module_exit(hello_exit); 

它的运行必须配合Makefile,其内容如下:
ifeq ($(KERNELRELEASE),)
KERNELDIR ?=/usr/src/kernels/2.6.18-8.el5-i686   #(内核所在的路径,这一句的意思是若KERNELDIR未定义,则定义为后面的路径)

PWD:= $(shell pwd)  #(在Shell里运行pwd,讲得到的当前路径赋给变量PWD)
modules:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
 rm -rf modules.* *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module*
.PHONY:modules modules_install clean
else
 obj-m := hello.o  #(加载模块的名称,如这里的hello.c文件,此时就为hello.o)
endif 

编译成功后,用insmod程序将模块动态链接到正在运行的内核中,也可以通过rmmod程序一处链接,modinfo程序查看编译后的模块信息,格式是:modinfo 模块名,最后用dmesg查看运行结果。

相关推荐