内核模块helloworld编译
环境:Ubuntu14虚拟机
内核模块编译流程
内核模块编译流程:
第一步:调用Linux源码树的makefile进行收集一个模块所需的信息
第二步:Linux源码树的makefile在收集完信息后,调用模块的makefile,获取需要编译的模块.c文件,最后生成内核模块
所以编译一个内核模块,需要写c程序和makefile文件
编写c程序
1 |
|
编写makefile
1 | #KERNELRELEASE:在内核源码树的makefile中定义,在当前的makefile中值为空 |
可以看到我们编写的makefile文件被调用了三次:
第一次:调用makefile文件,因为KERNELRELEAS为控制,所以调用源码树的makefile。
第二次:因为这次makefile文件是被Linux内核源码树的顶层makefile调用,变量KERNELRELEAS已经不为空了,所以编译hello.c文件,产生hello.o文件。
第三次:被Linux内核源码树的顶层makefile调用,根据.o文件生成.ko模块文件。
模块的使用
1、加载模块:insmod *.ko
sudo insmod hello.ko
2、查看系统中加载的模块: lsmod
sudo lsmod|grep hello
3、卸载模块:rmmod *.ko
sudo rmmod hello
4、查看printk打印的信息 dmesg 或 dmeg|tail(dmesg是从linux内核的ring buffer 中读取信息的,而printk打印的信息都会送到ring buffer中)
最后结果如上图,hello模块成功运行。
本篇参考:http://blog.chinaunix.net/uid-26833883-id-4366882.html
makefile报错解决:https://bbs.csdn.net/topics/390344596
评论加载中