Linux内核模块编程指南
申明:此系列原作者Ori Pomerantz 翻译:cherami简介
现在,你想写内核模块。你了解C语言并且已经写过一些普通的程序,现在你想接触真正的动作在哪儿,那个单一的疯狂的可以删除整个文件系统的指针及内核转储意味着重新启动在哪儿。
那么好吧,欢迎来到这个俱乐部。我曾经有一个疯狂的指针删除了DOS (值得庆幸的是,它现在代表 Dead Operating System)下的一个重要的目录,而且我看不出来为什么在Linux下会更安全。
警告: 我是在运行于Pentium的2.0.35 和 2.2.3 版本内核的系统下写下这些并检查那些程序的,对于其中的大部分,它们也会工作于其他的CPU和内核版本下,只要内核的版本是2.0.x 或 2.2.x,但我不能保证任何事。一个例外是11章 , 它们只能工作于x86系统下.
谁应该阅读本书
这个文档是为那些想写内核模块的人而写的。虽然我会在几个地方提及在内核中事情是如何完成的,但这不是我的目的。有足够的好的资料会在那方面做的更好。
这个文档也是为那些知道如何写内核模块但还不适应2.2版内核的人写的.如果你是这类人,我建议你看看附录 A以了解我在更新范例时遇到的所有的差异。那个列表是不全面的但我想它覆盖了大部分的基本功能并且足够让你开始新的工作。
内核是一大块程序,并且我相信程序员应该至少读懂一些内核源代码。说到这,我也相信首先使用系统然后问问题的价值。当我学习一种新的编程语言的时候,我不是从读库代码开始的,而是通过写一些小的`hello, world'程序开始的。我看不出来在内核上应该有什么不同。
注意风格
我喜欢在我的文档加入尽可能多的笑话。我写这是因为我喜欢它,并且我假设你们中的多数也读这也是基于同样的原因。如果你仅仅想接触这些,那么忽略所有的普通文本而去读源代码。我保证我已经将所有的重要的细节放在了注释里面。
修改记录
版本 1.0.1中的新东西
1. 修改节。
2. 如何查找最小的设备号。
3. 整理字符文件和设备文件之间的差异的说明。
4. 内核模块的make描述文件。
5. 对称多处理。
6. “坏主意”。
版本 1.1.0中的新东西
1. 支持内核版本2.2, 所有的地方。
2. 多内核版本源文件。
3. 2.0 版和 2.2版之间的变化。
4. 内核模块中的多文件。
5. 不要写和系统调用混合的模块。
感谢
我感谢 Yoav Weiss,他给了我很多有益的主意和讨论并且在这个文档出版前发现了很多错误,当然现有的错误完全是我的过错。这本书的 TEX 构架剽窃于 `Linux Installation and Getting Started Guide'(Linux安装与入门指南) , TEX 是Matt Welsh的作品. 我感谢Linus Torvalds, Richard Stallman 和所有其他让我得以在我的计算机上运行如此高质量的操作系统及源代码而没有指出的人(是的,那么我为什么说呢?)。
对版本 1.0.1
我不能列出所有给我发email的人,如果我没有列出你,我先在此道歉。下面的人对我有很大的帮助:
来自荷兰的Frodo Looijaard ,他提供了一个关于主机的有用的建议及关于 2.1.x 版本内核的信息.
来自新西兰的Stephen Judd 他进行了拼写校正.
来自瑞典的Magnus Ahltorp 他更正了我的关于字符设备和块设备之间的差异的错误。
对版本 1.1.0
来自加拿大魁北克的Emmanuel Papirakis 他编写了所有的对内核 2.2 的范例。
来自荷兰的Frodo Looijaard 他教会了我如何创建内核模块的多文件.
当然,任何现存的错误都是我的过错,如果你认为这些错误使本书是无用的,欢迎你向我索还你付给我的全额款项。