欢迎来到天天文库
浏览记录
ID:52199863
大小:97.67 KB
页数:83页
时间:2020-03-24
《LINUX内核模块编程.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、LINUX内核模块编程[转]ForewordTableofContents作者声明版本和注意感谢译者注作者声明《Linux内核驱动模块编程指南》最初是由OriPomerantz为2.2版本的内核编写的,后来,Ori将文档维护的任务交给了PeterJaySalzman,Peter完成了2.4内核版本文档的编写,毕竟Linux内核驱动模块是一个更新很快的内容。现在,Peter也无法腾出足够的时间来完成2.6内核版本文档的编写,目前该2.6内核版本的文档由合作者MichaelBurian完成。版本和注意Linux内核
2、模块是一块不断更新进步的内容,在LKMPG上总有关于是否保留还是历史版本的争论。Michael和我最终是决定为每个新的稳定版本内核建立一个新的文档分支。也就是说LKMPG2.4.x专注于2.4的内核,而LKMPG2.6.x将专注于2.6的内核。我们不会在一篇文档中提供对旧版本内核的支持,对此感兴趣的读者应该寻找相关版本的文档分支。在文档中的绝大部分源代码和讨论都应该适用于其它平台,但我无法提供任何保证。其中的一个例外就是Chapter12,中断处理该章的源代码和讨论就只适用于x86平台。感谢感谢下列人士为此文档
3、提供了他们宝贵的意见。他们是:IgnacioMartin,DavidPorter,DanielePaolo,Scarpazza和DimoVelev。译者注我,译者,名叫田竞,目前是一名在北京邮电大学就读的通信专业的大学生。自高中起我就是Linux的爱好者并追随至今。我喜欢Linux给我带来的自由,我想大家也一样。没有人不向往自由。我学习内核模块编写时最初阅读的是Orelly出版社的使用2.0版本的内核的书籍,但如同我预料的一样,书中的许多事例由于内核代码的变化而无法使用。这让想亲自体验内核模块的神秘的我非常苦恼
4、。我在Linux文档计划在上海的镜像站ldp.linuxforum.net上找到了这篇文档。受原作者Ori的鼓励,基于上次完成的LKMPG2.4的,内容有稍许的改变和扩充。应该是目前最新的了。翻译的方式有所改变,在基于LDP认可的docbook格式上翻译,通过docbook2html转换为附件中的html文档。由于对docbook不是很熟悉,其中的一些标题尚未翻译,而且可能破坏了原有的tag,导致html出现一些错误显示,但总体来说很少。修改了很多2.4中的错别字。学习并分享学习的过程是我翻译的最终目的。Cha
5、pter1.IntroductionTableofContents什么是内核模块?内核模块是如何被调入内核工作的?什么是内核模块?现在,你是不是想编写内核模块。你应该懂得C语言,写过一些用户程序,那么现在你将要见识一些真实的东西。在这里,你会看到一个野蛮的指针是如何毁掉你的文件系统的,一次内核崩溃意味着重启动。什么是内核模块?内核模块是一些可以让操作系统内核在需要时载入和执行的代码,这同样意味着它可以在不需要时有操作系统卸载。它们扩展了操作系统内核的功能却不需要重新启动系统。举例子来说,其中一种内核模块时设备驱
6、动程序模块,它们用来让操作系统正确识别,使用安装在系统上的硬件设备。如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜像来加入新的功能。这还意味着一个臃肿的内核。内核模块是如何被调入内核工作的?你可以通过执行lsmod命令来查看内核已经加载了哪些内核模块,该命令通过读取/proc/modules文件的内容来获得所需信息。这些内核模块是如何被调入内核的?当操作系统内核需要的扩展功能不存在时,内核模块管理守护进程kmod[1]执行modprobe去加载内核模块。两种类型的参数被传递给modpr
7、obe:一个内核模块的名字像softdog或是ppp。通用识别符像char-major-10-30。当传递给modprobe是通用识别符时,modprobe首先在文件/etc/modules.conf查找该字符串。如果它发现的一行别名像:aliaschar-major-10-30softdog它就明白通用识别符是指向内核模块softdog.o。然后,modprobe遍历文件/lib/modules/version/modules.dep来判断是否有其它内核模块需要在该模块加载前被加载。该文件是由命令depmod
8、-a建立,保存着内核模块的依赖关系。举例来说,msdos.o依赖于模块fat.o内核模块已经被内核载入。当要加载的内核模块需要使用别的模块提供的符号链接时(多半是变量或函数),那么那些提供这些所需符号链接的内核模块就被该模块所依赖。最终,modprobe调用insmod先加载被依赖的模块,然后加载该被内核要求的模块。modprobe将insmod指向/lib/modules/versi
此文档下载收益归作者所有