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


参考文档: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

    更多相关文章

    1. 如何卸载内核代码中的文件系统
    2. 全面解析Linux 内核 3.10.x - 编译前的准备
    3. Linux内核源代码情景分析读书笔记(5)-关于fork/clone/vfork
    4. linux 内核协议栈
    5. Ubuntu 12.04安装Bochs 2.6.2, 调试linux 0.11 内核
    6. 编译Linux内核 4.13
    7. 有关Linux内核分析课程的总结
    8. 20169210《Linux内核原理与分析》第七周作业
    9. linux内核分析——扒开系统调用的三层皮(下)

    随机推荐

    1. Android Zygote
    2. android framework 图解分享
    3. Android 布局 & 一些控件
    4. Android(安卓)Material Design动画 View
    5. Android-AbsoluteLayout(绝对布局)
    6. Android 之shape 的用法介绍
    7. Android(安卓)数据存储ContentProvider(类
    8. Android常用第三方框架
    9. Android(安卓)中的观察者模式Observer
    10. Android(安卓)初学者第一步 Activity生命