加载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查看运行结果。