没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Foreword ...........................................................................................................................................3
作者声明...........................................................................................................................3
版本和注意.......................................................................................................................3
感谢...................................................................................................................................3
译者注 ...............................................................................................................................3
Chapter 1. Introduction .....................................................................................................................4
什么是内核模块? ...........................................................................................................4
内核模块是如何被调入内核工作的? ...........................................................................4
Chapter 2. Hello World .....................................................................................................................7
Hello, World (part 1): 最简单的内核模块 ......................................................................7
Hello World (part 2) ..........................................................................................................9
Hello World (part 3): 关于__init 和__exit 宏 ................................................................10
Hello World (part 4): 内核模块证书和内核模块文档说明..........................................11
从命令行传递参数给内核模块 .....................................................................................13
由多个文件构成的内核模块 .........................................................................................16
为已编译的内核编译模块 .............................................................................................18
Chapter 3. Preliminaries ..................................................................................................................20
内核模块和用户程序的比较 .................................................................................................20
内核模块是如何开始和结束的 .....................................................................................20
模块可调用的函数 .........................................................................................................20
用户空间和内核空间 .....................................................................................................21
命名空间.........................................................................................................................21
代码空间.........................................................................................................................22
Device Drivers.................................................................................................................22
Chapter 4. Character Device Files...................................................................................................24
字符设备文件.........................................................................................................................24
关于 file_operations 结构体.....................................................................................24
Chapter 5. The /proc File System....................................................................................................32
关于 /proc 文件系统...................................................................................................32
Chapter 6. Using /proc For Input ....................................................................................................36
使用 /proc 作为输入...................................................................................................36
Chapter 7. Talking To Device Files .................................................................................................43
与设备文件对话 (writes and IOCTLs)..........................................................................43
Chapter 8. System Calls ..................................................................................................................56
系统调用.........................................................................................................................56
Chapter 9. Blocking Processes........................................................................................................62
阻塞进程.........................................................................................................................62
Chapter 10. Replacing Printks.........................................................................................................70
替换 printk ......................................................................................................................70
让你的键盘指示灯闪起来 .............................................................................................72
Chapter 11. Scheduling Tasks .........................................................................................................76
任务调度.........................................................................................................................76
Chapter 12. Interrupt Handlers........................................................................................................81
Interrupt Handlers ...........................................................................................................81
Chapter 13. Symmetric Multi Processing........................................................................................86
对称多线程处理.............................................................................................................86
LINUX 内核模块编程[转]
2
Chapter 14. Common Pitfalls ..........................................................................................................87
注意.................................................................................................................................87
Appendix B. Where To Go From Here............................................................................................89
为什么这样写?.............................................................................................................89
LINUX 内核模块编程[转]
3
Foreword
作者声明
《Linux 内核驱动模块编程指南》最初是由 Ori Pomerantz 为 2.2 版本的内核编写的 ,后来,Ori 将
文档维护的任务交给了 Peter Jay Salzman,Peter 完成了 2.4 内核版本文档 的编写,毕竟 Linux 内
核驱动模块是一个更新很快的内容。现在,Peter 也无法腾出足够的 时间来完成 2.6 内核版本文档的编
写,目前该 2.6 内核版本的文档由合作者 Michael Burian 完成。
版本和注意
Linux 内核模块是一块不断更新进步的内容,在 LKMPG 上总有关于是否保留还是历史 版本的争论。
Michael 和我最终是决定为每个新的稳定版本内核建立一个新的文档分支。也 就是说 LKMPG 2.4.x 专
注于 2.4 的内核,而 LKMPG 2.6.x 将专注于 2.6 的内核。我们不会在一 篇文档中提供对旧版本内核的
支持,对此感兴趣的读者应该寻找相关版本的文档分支。
在文档中的绝大部分源代码和讨论都应该适用于其它平台,但我无法提供任何保证。其中的一个例外就
是 Chapter 12, 中断处理该章的源代码和讨论就只适用于 x86 平台。
感谢
感谢下列人士为此文档提供了他们宝贵的意见。 他们是:Ignacio Martin, David Porter, Daniele
Paolo,Scarpazza 和 Dimo Velev。
译者注
我,译者,名叫田竞,目前是一名在北京邮电大学就读的通信专业的大学生。 自高中起我就是 Linux 的
爱好者并追随至今。我喜欢 Linux 给我带来的自由,我想大家也一样。没有人不向往自由。
我学习内核模块编写时最初阅读的是 Orelly 出版社的使用 2.0 版本的内核的书籍,但如同我预料的一样,
书中的许多事例由于内核代码的变化而无法使用。这让想亲自体验内核模块的神秘的我非常苦恼。 我在
Linux 文档计划在上海的镜像站 ldp.linuxforum.net 上找到了这篇文档。
受原作者 Ori 的鼓励,基于上次完成的 LKMPG 2.4 的,内容有稍许的改变和扩充。应该是目前最新的
了。 翻译的方式有所改变,在基于 LDP 认可的 docbook 格式上翻译,通过 docbook2html 转换为附
件中的 html 文档。 由于对 docbook 不是很熟悉,其中的一些标题尚未翻译,而且可能破坏了原有的
tag,导致 html 出现一些错误显示, 但总体来说很少。修改了很多 2.4 中的错别字。
学习并分享学习的过程是我翻译的最终目的。
LINUX 内核模块编程[转]
4
Chapter 1. Introduction
什么是内核模块?
现在,你是不是想编写内核模块。你应该懂得 C 语言,写过一些用户程序, 那么现在你将要见识一些真
实的东西。在这里,你会看到一个野蛮的指针是如何 毁掉你的文件系统的,一次内核崩溃意味着重启动。
什么是内核模块?内核模块是一些可以让操作系统内核在需要时载入和执 行的代码,这同样意味着它可
以在不需要时有操作系统卸载。它们扩展了操作系 统内核的功能却不需要重新启动系统。举例子来说,
其中一种内核模块时设备驱 动程序模块,它们用来让操作系统正确识别,使用安装在系统上的硬件设备。
如 果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜 像来加入新的功能。
这还意味着一个臃肿的内核。
内核模块是如何被调入内核工作的?
你可以通过执行 lsmod 命令来查看内核已经加载了哪 些内核模块, 该命令通过读取/proc/modules 文
件的内容 来获得所需信息。
这些内核模块是如何被调入内核的?当操作系统内核需要的扩展功能不存 在时,内核模块管理守护进程
kmod[1]执行 modprobe 去加载内核模 块。两种类型的参数被传递给 modprobe:
一个内核模块的名字像 softdog 或是 ppp。
通用识别符像 char-major-10-30。
当传递给 modprobe 是通用识别符时,modprobe 首先在文件 /etc/modules.conf 查找该字符串。如
果它发现的一行别名像:
alias char-major-10-30 softdog
它就明白通用识别符是指向内核模块 softdog.o。
然后,modprobe 遍历文件/lib/modules/version/modules.dep 来判断是否有其它内核模块需要在
该模块加载前被加载。该文件是由命令 depmod -a 建立,保存着内核模块的依赖关系。举例来说,
msdos.o 依赖于模块 fat.o 内核模块已经被内核载入。当要加载的内核模块需要使用别的模块提供的符
号链接时(多半是变量或函数), 那么那些提供这些所需符号链接的内核模块就被该模块所依赖。
最终,modprobe 调用 insmod 先加载被依赖的模块,然后加载该被内核要求的模块。modprobe 将
insmod 指向 /lib/modules/version/[2]目录,该目录为默认标准存放内核模块的目录。insmod 对内
核模块存放位置 的处理相当呆板,所以 modprobe 应该很清楚的知道默认标准的内核模块存放的位置。
所以,当你想要载入一个内 核模块时,你可以执行:
LINUX 内核模块编程[转]
5
或只是执行"modprobe -a msdos"。
Linux 提供 modprobe, insmod and depmod 在一个名为 modutils 或 mod-utils 的工具包内。
在结束本章前,让我们来看一个 /etc/modules.conf 文件:
#This file is automatically generated by update-modules
path[misc]=/lib/modules/2.4.?/local
keep
path[net]=~p/mymodules
options mydriver irq=10
alias eth0 eepro
用'#'起始的行为注释。空白行被忽略。
以 path[misc]起始的行告诉 modprobe 用 /lib/modules/2.4.?/local 替代搜寻 misc 内核模块的路
径。正如你看到的,命令解释器 shell 的元字符也可以使用。
以 path[net]起始的行告诉 modprobe 在目录 ~p/mymodules 搜索网络方面的内核模块。但是,在
path[net] 指令之前使用的"keep" 指令告诉 modprobe 只是将该路径添加到标准搜索路径中,而不是
像对待 misc 前面那样进行替换。
以 alias 起始的的行使 modprobe加载 eepro.o 当 kmod 以通用识别符'eth0' 要求加载相应内核模块
时。
你 不 会 发 现 像 "alias block-major-2 floppy" 这 样 的 别 名 行 在 文 件 /etc/modules.conf 因 为
modprobe 已经知道在绝大多数系统上安装的标准的设备的驱动模块。
现在你已经知道内核模块是如何被调入的了。当你想写你自己的依赖于其它模块的内核模块时, 还有一
些内容没有提供。这个相对高级的问题将在以后的章节中介绍,当我们已经完成前面的学习后。
在开始前
在我们介绍源代码前,有一些事需要注意。系统彼此之间的不同会导致许多困难。 顺利的编译并且加载
你的第一个"hello world"模块有时就会比较困难。但是当你跨过 这道坎时,后面会顺利的多。
内核模块和内核的版本问题
为某个版本编译的模块将不能被另一个版本的内核加载如果内核中打开了 CONFIG_MODVERSIONS
选项。我们暂时不会讨论与此相关的 内容。在我们进入相关内容前,本文档中的范例可能在该选项打开
的情况下无法 工作。但是,目前绝大多数的发行版是将该选项打开的。所以如果你遇到和版本 相关的
错误时,最好,重新编译一个关闭该选项的内核。
使用 X 带来的问题
强烈建议你在控制台下输入文档中的范例代码,编译然后加载模块,而不是在 X 下。
insmod /lib/modules/2.5.1/kernel/fs/fat/fat.o
insmod /lib/modules/2.5.1/kernel/fs/msdos/msdos.o
Edited by Foxit Reader
Copyright(C) by Foxit Software Company,2005-2007
For Evaluation Only.
剩余88页未读,继续阅读
chengtao786
- 粉丝: 0
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页