linux 内核模块学习
【学习网上资料,整理操作过程和经验,有部分引用】
参考文档:https://segmentfault.com/a/1190000004448907
kernel module 最典型的的例子是设备驱动,【老师说,驱动大部分都做成模块,但并不一定要做成模块】阅读了Linux2.6.37 v1.0 的内核代码,其中已经在内核内部的各个功能实现也是写成模块,以init_module 开始,以cleanup_module 结束。我们现在写的模块像是一个外部零件(与内部零件性质一样),可直接加载到内核中使用,而不需要重新编译内核,提高了效率。
查看内核中已有模块的命令:lsmod 或 cat proc/modules
/proc目录:是一个伪文件系统,它只存在于内存中,不占用外存用户可以通过proc获取系统信息和内核内部数据结构,例如进程号。
/proc目录下有每个进程对应的一个目录,里面存放了当前组,环境变量,一些错误信息等等。
【查看所有运行的进程:ps aux】
编写内核模块代码,c文件:
头文件:Linux/kernel.h linux/module.h
【头文件在 /usr/include/ 目录下】
内核代码不能使用标准IO库,其输出为printk 使用方法和printf 基本一样。【详见http://www.makelinux.NET/books/lkd2/ch18lev1sec3】
主要区别在于loglevel ,涉及到信息是否打印到console。一般直接输出到 /var/log/messages
makefile的编写:
代码的编译需要依赖许多内核文件,makefile指定其路径,找到内核文件后加载,然后自动调用gcc,所以不用于普通程序使用gcc编译。
编译过程中,有进入内核文件和离开的过程
c文件的包装:
不需要是要固定格式 init_module 和exit_module 函数,而是使用 __init 和 __exit 两个宏。
这两个宏是 kernel 2.2 及以后版本的特性,在 linux/init.h 中定义。详见http://www.tldp.org/LDP/lkmpg/2.4/html/x281.htm
【存疑:The__exitmacro causes the omission of the function when the module is built into the kernel, and like__exit, has no effect for loadable modules. ; built-in drivers don't need a cleanup function, while loadable modules do.】
c文件
具体执行函数名可自定义,相比init_module ,exit_module 更加直观可读。
make 以后,得到以下文件
加载模块 insmod hello_world.ko (sudo ......) 卸载模块 rmmod .....
两次打印都不会出现在终端,可用dmesg 命令查看
【要想打印到终端,可修改配置文件或写一个函数,参考http://bbs.chinaunix.net/thread-1945096-1-1.html### 未验证】
注意 license 不要拼错,
modinfo 查看编译好的模块信息
2017.3.18
更多相关文章
- 如何卸载内核代码中的文件系统
- 全面解析Linux 内核 3.10.x - 编译前的准备
- Linux内核源代码情景分析读书笔记(5)-关于fork/clone/vfork
- linux 内核协议栈
- Ubuntu 12.04安装Bochs 2.6.2, 调试linux 0.11 内核
- 编译Linux内核 4.13
- 有关Linux内核分析课程的总结
- 20169210《Linux内核原理与分析》第七周作业
- linux内核分析——扒开系统调用的三层皮(下)