IV. 模块编程和内核版本密切关联,因为不同的内核版本中某些函数的函数名会有变化.因此模块编程也可以说是内核编程.
V. 只用超级用户可以对其运行.
开始我们的Hello World!
没有编译前的目录结构:
首先编辑 hello.c文件:
1 #include<linux/module.h> 2 #include<linux/kernel.h> 3 #include<linux/init.h> 4 5 static int hello_init(void) 6 { 7 printk("Hello word"); 8 return 0; 9 } 10 static void hello_exit(void) 11 { 12 printk("Goodbye world"); 13 } 14 15 module_init(hello_init); 16 module_exit(hello_exit); 17 18 MODULE_LICENSE("GPL");
然后编辑makefile文件:
1 ifneq ($(KERNELRELEASE),) 2 obj-m:=hello.o 3 else 4 PWD:=$(shell pwd) 5 KDIR:=/lib/modules/$(shell uname -r)/build 6 all: 7 $(MAKE) -C $(KDIR) M=$(PWD) 8 clean: 9 rm -rf *.o *.mod.c *.ko *.symvers *.order *.markers 10 endif
编辑完成,检查无错后,执行make指令:
然后,编译完成后在看一下目录结构:
产生了许多中间文件,其中 .o文件是对象文件, .ko文件是kernel object . 接下来就可以安装模块了(insmod 模块名.ko)
没有任何输出,说明安装成功了.
我们不能在控制台看到我们自己编写的模块的输出,因为这时内核编程,只能通过查看系统日志来看我们的输出.使用 dmesg | tail -1 产看输出,也可以直接查看日志文件.
出现hello: module verification failed: signature and/or required key missing - tainting kernel 不影响模块的加载.
最后模块退出(rm mod 模块名):
这样一个hello World 就完成啦!
对于 hello.c文件的模块编程还是有必要说明一下的.