linux 内核模块学习

【学习网上资料,整理操作过程和经验,有部分引用】


参考文档:https://segmentfault.com/a/1190000004448907


kernel module 最典型的的例子是设备驱动,【老师说,驱动大部分都做成模块,但并不一定要做成模块】阅读了Linux 2.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 __exit macro 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

  

    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值