linux设备驱动程序第二版 序言
发布日期:2021-07-22 22:18:54 浏览次数:3 分类:技术文章

本文共 6446 字,大约阅读时间需要 21 分钟。

作为一名电子工程师,而且是一个什么都想自己做的人,我一向愿意用计算机来控制外部设备。甚至还在我们父辈的Apple-2e时代,我就已经开始寻找别的平台,希望可以与我定制的环境相连,并且可以写我自己的驱动程序软件。不幸的是,八十年代的个人电脑并没有那么强大,不论在软件层还是硬件层上,个人电脑的内部设计都远不如Apple-2e,并且在很长一段时间内,可以获得的文档都不能令人满意。但是,接着发生的事是Linux出现了,我决定试一试,于是买了昂贵的386主板,并且没有跑任何商业软件。

那时侯,我正在大学里使用Unix系统,并为这样聪明的一个操作系统所震动,特别是又补充了GNU计划提供给用户的更智慧的工具后,我更是为Unix所深深陶醉。在我自己的个人电脑主板上跑Linux实在是一个有趣的经历,我甚至可以自己写设备驱动程序,而且又可以玩烙铁了。我不断告诉别人:“当我长大了,我一定会是个黑客”,Linux是实现这个梦想的绝佳平台。这就是说,用不着长大我就可以实现梦想了。

Linux成熟起来以后,越来越多的人对写特制电路的设备驱动程序和商业设备的驱动程序感兴趣了。正如Linus Torvalds告知大家:“我们退回到这样一个时代——人人都为自己写设备驱动程序。”

当我不能再写出有创意的编码以后,我就开始为Linux Journal写一些技术性文章了,这也算是为Linux社团的一点贡献吧。后来,O’Reilly Andy Oram有意让我编写一本讲设备驱动程序的书,我接受了这个任务。尽管,真正的黑客可以在正式发布的内核代码中找到所有必要的信息,但是写出来的文本对提高编程技巧还是有用的。你拿到的这个东西是我花几小时的时间对内核资源耐心grep的结果,我希望最后的结果对得起我的努力。如果本书能作为那些想成为内核黑客又不知道从何下手的人的一个起点的话,就足以达成我的愿望了。

本书读者

从技术角度来讲,本书应该提供唾手可得的途径去理解内核内幕以及Linus本人在开发时所做的设计抉择。尽管本书的主要目的是教如何写设备驱动程序,但它所包容的内容应该也对内核的执行给出一个完整的概貌。

对那些想玩电脑的人和那些涉及Linux机器的内部的专业程序员来讲,本书都会是一个很有趣的资料来源。注意:“Linux机器”这个概念比“跑LinuxPC”这个概念还要广泛,因为我们的操作系统支持很多平台,而且内核编程也不局限于某一种平台上。

Linux的狂热支持者会发现本书提供了大量的精神食粮。开始可以玩一玩编码,然后就可以加入到开发者小组中了,他们可是在孜孜不倦地工作以提供新的功能,提高系统性能。Linux仍处在不断完善的过程当中,并且总能为新加入的程序员提供新的空间。

换句话说,如果你只是想给你自己的设备编一个设备驱动程序,而不想在内核内幕上下什么工夫,本书的模块化结构也绝对可以满足你的要求。如果你不想深入细节,你可以跳过大多数技术章节,而直接查找设备驱动程序的标准API,它们与系统的其他部分是无缝连接的。

本书主要目的是为Linux 2.0写一个内核模块。模块是对象代码,可以在运行的内核中动态加载新功能。讨论也会涉及到1.2版本的内核。最后一章描述从2.0 2.1.43 (在本书进行技术回顾时的最新版本)的驱动程序接口的变化。

材料的组织

本书介绍的主题会越来越复杂,它们可以分成两个部分。第一部分(第1章到第10章)从内核模块的正确安装开始介绍,会涉及到写字符设备驱动程序需要面对的各方面的问题。每章会讨论一个独立主题,并且在末尾包含一个“符号表”,在实际开发时,可以用作参考。当我写自己的设备驱动程序时,我发现我会回头去查自己写的章节,我希望你也可以充分利用这个符号表。

贯穿本书第一部分材料的组织方式大致是从面向软件到面向硬件。这意味着你可以在没有附加设备的情况下在你的机器上测试软件。每章都包含源代码,并指出可以使用的驱动程序的例子,这些例子在所有Linux机器上都可以实现。在第8章和第9章,我会要求你在并口上连一根金属线,用来测试一下硬件,但这种要求对所有人来讲都是很容易实现的。

本书第二部分描述了一些块设备驱动程序,和网络接口,以及更进一步的深入讨论。很有可能,这里讨论的大部分东西在你写实际驱动程序中用不到,但我希望第一部分能够引起足够兴趣来阅读第二部分。

事实上,我罗列的大部分材料都很有意思,而且与实际编写设备驱动程序时需要的材料没有什么关系。在我写这本书的时候,很多学生就他们的需求问了我一些关于Linux的问题。他们一定很高兴看到这些章节对他们的工作有帮助,即使他们的工作与编写驱动程序无关。

背景信息

要想阅读本书,应该熟悉C语言编程。也要有点Unix的专业知识,例如我会经常提到Unix命令和管道。

在硬件层,不需要预先的专业知识,前提只要求总体概念清晰就可以了。本书不基于什么特殊的PC硬件设备,而当我用到什么特殊设备的时候,我会提供所有相关信息。

如果能够连接到互网上,读者可以享受很多便利,因为从网络上可以获得很多新鲜有趣的文档和升级软件。当然,有上网条件并不是必须的,我自己上网条件就很破(主要得托Italian电话通讯公司快速网络速度的福)

只要一涉及到软件,你就需要安装Linux系统了,这样就可以运行例子的驱动程序。注意,任何发布版本都可以使用(并且所有的硬件平台也都适用)。我在第一章完整地列出了所需软件包的清单,因为如果放到‘序’中,很多读者会漏掉这些信息。(我希望能有很多人可以跳过第一章;大多数读者不都是黑客吗?)

深入信息来源

本书中涉及的大多数信息都是直接取材于内核的。只要你的系统上装了Linux,就几乎不需要什么文档来做补充。在写设备驱动程序时,几乎没有什么富有趣味的书可供参考,而主要信息来源就是内核的源代码和你设备的技术文档。不用再说什么了,你应该很感激描述你机器平台的手册。

至于了解内核内部机制的工作,最好的信息来自互网(仅次于源文件)。Linux Journal也有一些有趣的技术性文章。查看“内核之角”(kernel Korner)卷,但跳过我的文章——因为我可能重复自己;没有内核之角标识的文章实际上也挺有意思,但是一般技术性没有本书读者要求的那样高。

在互网上,我建议查找下面网址:

http://www.redhat.com:8080/

小红帽上的超新闻(HYPERNEWS)服务器提供‘内核黑客指南’,这是关于内核内幕的很有趣的文档。其中的一些章节已经很老了,但是最近更新了其中一部分东西。按照我的观点,这些材料相当有趣。

http://www.kernel.org/

ftp://ftp.kernel.org

本站点是Linux内核开发的中心。可以获得最新发行版和相关信息。注意,这个FTP站点在全球都有镜像,所以你可以找最近的。

ftp://sunsite.unc.edu/pub/Linux/docs/

ftp://tsx-11.mit.edu/pub/Linux/docs/

Linux文档计划”中有大量称为“HOWTO”的有趣文档;一些与内核相关的主题极具技术性。Sunsitetsx-11还有大量在Linux上可以应用的程序;总的来讲,不仅仅是docs/目录,他们都相当有趣。我敢肯定你已经知道这些文件了,但我觉得还是有必要提到他们。

http://www.ssc.com/

SSC,专业系统顾问,是Linux Journal的出版商,他们的站点有他们出版的大部分文章的HTML版。他们印刷的有趣文章在出版不久后就转换成HTML文件,在Web上发行。

http://www.conceta.it/linux/

这是个意大利站点,Linux的拥护者积累了大量信息,这些信息是关于所有正在运行的和 Linux有关的项目。也许你已经知道一些有有关Linux开发的HTTP连接的站点;如果你不知道,这个站点是个很好的起点。

相关书目

除了源码和互连网资源,很多好书也涉及到本书讨论的一些主题。下面的列表是我个人在这个领域内选择的一些书籍。我列的这些书或者是Unix系统软件功能文档,或者描述了有趣的硬件主题。我没有列出任何关于PC结构的书,因为现在这样的书太多了。不幸的是我也没法建议任何关于Sparc结构的书,因为我找不到这样的书。如果你需要有关信息,我绝对相信通过WEB你可以填补这个空缺。

[0] Bach, Maurice. The Design of the Unix Operating SystemPrentice Hall.1986.

本书尽管内容相当陈旧,但含盖了所有运行Unix的主题。它可是Linus本人编写Linux第一版时主要的灵感来源。

[1] Beck , Michael. Linux Kernel Internals. Addison-Wesley. 1997.

本书重点在于Linux的内部数据结构和算法;如果你喜爱这写详细介绍,你会很喜欢这本书的。第一版对应Linux 1.2版;我不知道最新版本有什么进展。2.0版及其后继版本与1.2版有很大差别。

[2] Stevens, Richard. Advanced Programming in The Unix Environment. Addison-Wesley. 1992.

这里介绍了所有Unix系统调用的详细资料。在使用设备高级功能的方法时,本书会是很好的参考。对Unix语义中任何可能的不明之处,参考本书都可以得到解决。

[3] Stevens, Richard. Unix Network Programming. Prentice Hall. 1990.

如你所想,本书是网络主题的高效参考书。在主题选择范围和质量上和“Advanced Programming”相匹配。本书包含有各种源代码可以测试用户空间网络编程的各个角落。

[4] Comer, Douglas, and Stevens, David. Internetworking with TCP/IP Vol I,II,III. Prentice Hall. 1991.

本书搜集了所有关于Internet的网络信息。描述了Internet协议族和一些它们的实现。

[5] Shanley, Tom, and Anderson, Don. PCI System Architecture. Addison-Wesley.1995.

本书详述PCI总线和标准接口。在大多数硬件主题中都可以找到类似“系统结构”这样的标题,这些都是由一个作者写的。这些书都很有趣,尽管有那么点偏向于PC。我最喜欢PCI那一卷。这些书中至少有一本我不喜欢,但如果仔细研究,可以看出这本书不错,就是所描述系统结构不怎么样。

[6] Digital Semiconductor. Alpha AXP Architecture Handbook. Digital Semiconductor. 1994.

Digital Semiconductor可以免费获得本书和“Alpha AXP Reference Manual”。它们介绍了Alpha处理器的机器语言,以及所涉及使用的设计主题。本书的订货号码是EC-QD2KA-TE

本书使用的约定

下面给出本书所使用的字体约定。

Italic

用于文件和目录名,程序和命令名,命令行选项,电子邮件地址以及路径名,URL强调新名词。

Boldface

用来表示按键(如,Ctrl-N)。

Constant Width

代码

Constant Italic

用来表示变量选项,关键字,或是用户用来替代实际值的文本。

Constant Bold

在例子用来表示应该由用户键入的命令或其他文本。

我们很愿意听您的反馈

我们已尽全力调整本书内容,但您仍可能发现有些内容不对(甚至我们可能出了错误!)如果您的建议与我们以后版本有关,请告诉我们您找到的错误以及您的建议,写信到:

O’Reilly & Associates,Inc.

101 Morris Street

Sebastopol , CA 95472

1-800-998-9938(美国或加拿大)

1-707-829-0515(国际/本地)

1-707-829-0104(传真)

您也可以给我们电子邮件。加入邮件组或要一份目录,请发电子邮件到:

nuts@oreilly.com(通过互连网)

uunet!oreilly!info(通过UUCP

询问技术问题或对本书的评论,请发电子邮件到:

bookquestions@oreilly.com(通过互网)

最后,您可以在WWW上找到我们http://www.oreilly.com/

致谢

本书不仅仅是我个人努力的结果:许多人不仅在硬件材料上给了我充分的帮助,精神上也给了我巨大的支持。我要感谢Quant-XDreyer先生,他借给我一部Alpha计算机,这样我可以测试本书例子代码的可移植性。Sun-Italia对我也很好,他们借了我一部Sparc机器,这样我可以把他们机器的操作系统升级成我需要的。ImageNation捐赠我了一个PCI视频捕捉卡,我可以用来研究PCIDMA特性。

如果没有Andy OramMichael Johnson的支持,没有Federica,我的女朋友——,我妻子在心理上对我的支持,本书是不可能完成的。Andy是我全能的编辑,而就是Michael要求我给Linux Journal写东西的,并且把我介绍给Andy——如果有什么人对本书觉得心虚,那就是Michael了。我还要感谢Georg van Zezschwitz,他介绍给我这个奇妙的内核模块世界,并且在给Linux Journal写文章时,给了我很大帮助。我想感谢Silvana Ranzoli,我高中时代的英语老师,由于她无情地(有时简直感觉象是残酷)承诺可以得益于她的班级。我感激Ellen Siever,她纠正了我在高中以后学到的所有不正规语法,由于我对重写从来不满意,所以每当我有那种黑客主义和极端细致倾向是时候,她对我总是格外耐心。

Alan CoxGreg HankinsHans LermenHeiko EissfeldtMiguel de Icaza(按照首字母顺序)从技术角度评论了本书。他们的意见和建议对我的小错和不足很有用。我要感谢他们在我写书的过程中所花费的宝贵时间,这看起来跟他们这些大拿要做的事情毫不相干。

我还要感谢允许我花时间集中精力研究Linux内核,而不是从事实际的‘工作’的人们。包括Virginio CantoniAlberto Biancardi还有大学里可视实验室的其他工作人员。还要感谢Davide Yachaya system.it的所有工作人员,我本来是在那里帮忙做网络管理员的。

也要感谢O’Reilly的全体工作人员:David Futato,版本编辑和产品编辑;Chris Reilley,技术插图作者;Jane EllinNicole Gipson Arigo的质量担保;Seth Maislin,制作索引;Len MuellnerChris Maden的工具支持;Edie Freedman的封面设计;Nancy Priest的内部设计;还有Sheryl Avruch,产品经理。

放到最后的可不是最少的。我要感谢Linux开发者的忘我工作。这包括内核编码人员和用户级编码人员,他们常常被忽略。本书从未指出他们的姓名,因为我可能忘记一些人,这样对他们就公平了。但有时,我破例叫了Linus的名字——希望他不介意。

 

转载地址:https://blog.csdn.net/menuconfig/article/details/1757507 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:linux设备驱动程序第二版 Linux内核简介
下一篇:第十章 动词概说

发表评论

最新留言

不错!
[***.144.177.141]2024年04月10日 01时00分32秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

功能测试(1) 2021-06-29
安全性测试(1) 2021-06-29
html基础 2021-06-29
vi—终端中的编辑器 2021-06-29
Linux 2021-06-29
jmeter-性能测试基础 2021-06-29
unittest 2021-06-29
错误推断法-维护中 2021-06-29
AJAX教程 2021-06-29
git基础 2021-06-29
git基础-01 2021-06-29
mysql-总结 2021-06-29
IPv4地址 2021-06-29
正则表达式 2021-06-29
redis 2021-06-29
术语-维护中 2019-04-26
software 2019-04-26
idea-ide 2019-04-26
technology 2019-04-26
spider-02 2019-04-26