最简单的提高硬件的性能的办法是在主板上插上多个CPU(阅读是最便宜的方法)。要么让不同的CPU做不同的工作(非对称多处理),要么让它们并行运行同一工作(对称多处理,缩写为SMP)。有效的使用非对称多处理需要专门研究计算机将要做的任务的知识,而这是在例如LINUX这样的通用操作系统上不可能的。另一方面,对称多处理实现起来相对简单。 相对简单,我的确切的意思是--不是真的简单。在一个 对称多处理的环境中,多个CPU分享同一内存,结果是运行于一个CPU上的代码可以影响另一个使用的内存。你不再能保证你在前面几行中设置的某个变量的值保持着相同的值--另一个CPU可能在你没有看见时修改了它。明显的,对程序的像这样的问题是不能忍受的。
在进程编程中这通常不成为一个问题,因为一个进程通常在同一时间(例外是线程,它们可以同时运行于几个CPU。)只运行于一个CPU上。另一方面,内核可能被运行于不同的CPU上的不同进程调用。SPIN
在 2.0.x版中,这不是问题,因为整个内核在一个大自旋锁里面。这意味着当一个CPU在内核里,而另一个CPU例如因为系统调用而要进入内核,它不得不得到第一个CPU完成它的工作。这使LINUX的SMP安全(意思是和SMP使用它是安全的。 ),但严重的低效。
在 2.2.x 版中,几个CPU同时在内核中。这是一些模块编写者应该注意的。我得到某人给我的使用一个SMP单元的权利,因此这本书的下一版有希望包含更多的信息。
常见的陷阱
在我把你送往这个世界和编写内核模块外之前,有一些事情我需要警告你。如果我没能警告你而使某些坏的事情发生的话,请向我报告那个问题并向我索要你为此书而付给我的全额款项。
1. 使用标准库文件 你不能那样做。在内核模块中你只能使用内核的函数,它们在 /proc/ksyms中可以看到。
2. 关闭中断 你也许需要短暂的关闭中断而那不会有什么问题,但是如果你不能随后打开它们,你的系统将被粘住而你不得不给它断电。
3. 将头粘在巨大的食肉动物里 我或许还没有警告你这个,但我无论如何会,只在万一的情况下。
2.0 和2.2版之间的变化
我并不彻底的知道内核以写出所有的变化。在范例转化的过程中(或者适应Emmanuel Papirakis的变化)我遇到了下面的差异。我在这儿列出所有的我知道的以帮助模块程序员,特别是从本书的上一版中学习的那些人和使用和我使用的技术大多相似的人,转化到新的版本。
一个为希望转化为2.2版的人有用的附加的资源在 http://www.atnf.csiro.au/~ rgooch/linux/docs/porting-to-2.2.html.
1.asm/uaccess.h 如果你需要 put_user 或者 get_user 你需要 #include 它。
2.get_user 在 2.2 版中, get_user 接收指向用户内存段的指针和内核内存段的变量以填充信息。原因是如果我们读的变量是两个或四个字节长, get_user现在可以一次读完。
3.file_operations 这个结构在 open 和 close 函数间有刷新函数。
4.file_operations中的关闭函数 在 2.2版中,关闭函数返回整数,因此它允许失败。
5.file_operations中的读写函数 这些函数的头文件改变了。它们现在返回 ssize_t 而不是整数,而且它们的参数列表也不同。节点不再是参数而是文件偏移量。
6.proc_register_dynamic 这个函数不再存在。你可以调用普通的 proc_register 函数并将结构的节点成员设置为0。
7.Signals 任务结构中的信号不再是32位整数而是 _NSIG_WORDS 整数数组。
8.queue_task_irq 即使你想从中断句柄中让一个任务按进度表发生,你应该使用 queue_task,而不是queue_task_irq.
9.模块参数 你不能只将模块参数声明为全局变量。在 2.2 版中你必须也使用MODULE_PARM 声明它的类型。这是一个巨大的改进,例如它允许模块接收以数字开头的字符串参数而不会混淆。
10.对称多处理 内核不再局限在一个巨大的旋转锁里面,这意味着内核模块必须知道对称多处理。
从这儿到哪儿?
我可以轻易的将更多章节的内容加入这本书。我可以加入关于创建一个新文件系统的章节或者加入新的协议栈(好象这儿需要它--你不得不发掘一个不被Linux支持的协议栈)。我也可以加入我们还未接触的内核机制的解释,诸如自举或磁盘接口。
然而,我没有选择这样做。我写这本书的目的是为神秘的内核模块编程提供基本的开端和为此目的的通用技术。对于真正的对内核编程感兴趣的人,我推荐位于 http://jungla.dit.upm.es/~ jmseyas/linux/kernel/hackers-docs.html的内核源文件列表。就像 Linus 所说的,学习内核的最好的办法是自己阅读源代码。
如果你对更多的短的内核模块范例感兴趣,我推荐Phrack 杂志。即使你对安全不感兴趣(作为程序员你应该感兴趣),那儿有很多很好的范例内核模块让你知道在内核中可以做什么,它们足够短,以至于不需要太多的努力就可以理解。
我希望我已经在你寻求成为更好的程序员上有帮助或者至少通过技术提供了乐趣。而且,如果你写了有用的内核模块,我希望你在 GNU通用公共许可协议下发布它以便我也可以使用他们。
商品和服务
我希望没有人注意到这儿的不知羞耻的宣传。它们是所有可能对开始Linux内核模块编程人员有用的事情。
得到这本书的印刷版
Coriolis 团体准备在99年的夏天将这本书印刷出来。如果现在已经是夏天,而且你想得到这本书的印刷版你可以向你的印刷商购买它。
表示你的感谢
这是一个自由文档。对于除GNU 公共许可协议规定条款以外的事情你没有责任。然而,如果你因为得到这本书而想为了作为回报而做什么的话,这有一些你可以做的。
给我发明信片
Ori Pomerantz
Apt. #1032
2355 N Hwy 360
Grand Prairie
TX 75050
USA
如果你想收到感谢回函,请写明你的e-mail 地址。
向自由软件团体捐献财物或更好的--时间。在 GNU公共许可协议下编写程序或文档并发布。教其他人如何使用自由软件,例如 Linux 或 Perl。
向人们解释自私是和居住在一个社会或帮助别人是矛盾的。我喜欢写这个文档并且我相信发布它对我的未来是有帮助的。同时我写了一本书去帮助你们(如果你得到的话)。记住,让别人高兴通常比让别人不高兴对你自己更有用,让人们上路 比让人们低能更好。
高兴。如果我遇到你,它将使那次相遇更愉快,也能使你对我更有用。 ;-)。
关于这个文档 ...