《Essential Linux Device Drivers》linux那些事


《Essential Linux Device Drivers》翻译笔记整理001

by muge0913

演化

Linux于 1991 年起源于一位名为 Linus Torvalds 的芬兰大学生的业余爱好,但很快就发展成为受全球欢迎的先进的操作系统。 Linux 第一次发布时仅支持 Intel 386 处理器,但是后来,内核在复杂性上逐步增加,可以支持众多的体系结构、多处理机系统和高性能集群。 Linux 支持很多 CPU ,主要支持的一些体系结构有 x86 、IA64 、 ARM 、 PowerPC 、 Alpha 、 s390 、 MIPS 和 SPARC 。 Linux 已经被移植到成千上万个基于这些处理器的硬件平台之上。与此同时,内核还在不断完善,并以飞快的脚步发展。

虽然开始的时候只是一个桌面操作系统,但目前 Linux 已经进入嵌入式和企业领域,并渗入我们的日常生活。当你按掌上电脑的按键、调节你的遥控器到天气频道或者在医院接受体检的时候,很有可能某些 Linux 代码正在为你提供服务。一方面, Linux 有很大的技术优势,另一方面, Linux 可以免费获得,这两方面对它的变革发挥着重大的作用。由于能够降低消费类电子产品的价格, Linux 已成为该领域一个很好的选择,因为专有操作系统的价格有时候比硬件本身的价格还贵。

GNU copyleft

GNU项目(GNU是 GNU 'sNot UNIX的递归缩写,即GNU不是UNIX)比Linux诞生得更早,它发起的目标是定制 一个免费的类UNIX操作系统。一个完整的 GNU 操作系统包含 Linux 内核,但也包含一些其他组件,如库、编译器和实用工具(utility) 。因此,基于Linux 的计算机的更准确称呼应该是 GNU/Linux 系统。 GNU/Linux 系统的所有组成部分都建立在自由软件之上 。

自由软件的种类有很多,其中一种是公共领域 (public domain)的软件。公共领域发布的软件没有版权,对它的使用也不会强加任何限制。 你可以免费使用它 ,随意修改它,甚至限制你修改后代码的发布 。 你会发现 ,"没有限制 "在下行过程中反而引入了限制 。

GNU 项目的主要支撑者-- 自由软件基金会,创造了GNU公共许可证 (GNU PublicLicense , GPL), 它 也 被 称为 copyleft[ ② ] , 以 防止有人中途将自由软件转化为专有软件 。 如果某人修改 了 copyleft 的软件 ,就必须以 copyleft 的方式分享他的软件 。 GNU 系统中的 Linux 内核以及像GNU 编译器( GNU Compiler Collection , GCC ) 等大部分组件都以 GPL 发布 。 因此,如果你修改了内核, 你就必须在社区分享此修改 。 基本上,你必须以 copyleft 的形式将授予你的权利传递出去。

GPL阅读地址:

http://www.gnu.org/licenses/gpl-2.0.html#TOC2

Linux 内核基于GPL第2 版。在内核社区,人们一直在争论是否应该支持GPL的最新版本GPL v3 。目前的趋势似乎是反对采取GPL v3 。

通过系统调用访问内核服务的 Linux 应用程序没有被看作衍生的工作, 因此并不受限于 GPL。而库则采用GNU轻量级通用公共许可证(GNULesser General Public License , LGPL),其限制要少于 GPL 。专有软件也允许与 LGPL下的库动态链接 。

邮件列表和论坛

Linux内核邮件列表(Linux KernelMailing List,LKML)是开发人员就设计问题进行辩论并决定Linux未来要包含的功能的论坛。你可以在www.lkml.org看到实时的邮件列表。Linux内核目前包含由遍布于世界各地的成千上万的开发人员贡献的数百万行代码,正是lkml将他们连在一起。

LKML并不是为了解答一般的Linux问题,其基本规则是只能张贴与内核有关的、以前没有被回答过并且在众所周知的文档中没有提及的问题。如果在你编译Linux应用程序的时候C编译器崩溃了,你应该在其他地方张贴这样的问题。

LKML中讨论的一些问题线索甚至比畅销的《纽约时报》更有趣,花几个小时浏览LKML的压缩包将有助于你洞察Linux内核背后的理念。

内核的大部分的子项目都拥有自己的邮件列表。因此,如果你正在开发Flash设备的驱动,就可以订阅linux-mtd邮件列表;如果你发现了Linux USB存储设备驱动的bug,就可以在linux-usb-devel 邮件列表发起一个线索。在以后的几章中,我们就参考了相关的邮件列表。

在各种论坛上,来自世界各地的内核专家会聚集于同一个屋檐下共同商讨Linux技术。加拿大渥太华每年举行一次的Linux Symposium就是这样的一个会议。其他的还包括在德国举行的Linux Kongress和在澳大利亚组织举行的linux.conf.au。也有一些Linux论坛聚集了众多的商界领袖,他们在论坛上分享真知灼见,其中的一个例子就是每年在北美举行的LinuxWorldConference and Expo。

在http://lwn.net/上可以获得Linux开发社区的最新消息。如果你只是想简单地了解内核的最新发布版,不想阅读太多的资料,http://lwn.net/可能是一个好地方。另一个网络社区http://kerneltrap.org/则讨论当前的内核议题。

在每个主线Linux内核版本发布中,你都会看到重大的改进,如内核抢占、不受限于锁(lock-free)的读操作、分担中断处理工作的新服务或者新体系结构的支持。因此,请一直跟踪邮件列表、网站和论坛,以保证自己在Linux技术上厚重的份量。

Linux发行版

一个GNU/Linux系统除了内核以外,还由大量的实用工具(utility)、程序、库和工具(tool)组成,因此,获得和正确安装所有的组件将是一项艰巨的任务。而Linux发行版则有序地将这些组件进行了分类,并捆绑成相应的包。一个典型的发行版包含了数以千计现成的包。这使得用户无需担心下载不到正确版本的程序,也无需关心程序间的依赖问题。

因为打包是GNU许可证范围内的一种有效的赚钱方式,因此,目前的市场上诞生了不少Linux发行版。其中,Red Hat/Fedora、Debian、SuSE、Slackware、Gentoo、Ubuntu和Mandriva这些发行版定位于桌面用户;而MontaVista、TimeSys和Wind River发行版则面向嵌入式系统开发。通常,嵌入式Linux的发行版还包括一套可动态配置的紧凑的应用程序集,以便针对资源的限制为系统进行量体裁衣。

除了打包以外,发行版还为内核的开发提供了增值服务。因此,许多项目都开始于发行版提供的内核而非kernel.org发布的官方内核,之所以要这样做,理由有如下几个。

1、 Linux发行版遵守设备工业领域的标准,因此是开发的更好起点。特殊兴趣组(Special InterestGroup,SIG)已经成立,其目的是促进Linux在各个领域的应用。消费电子产品Linux论坛(ConsumerElectronics Linux Forum,CELF,网址为www.celinuxforum.org)集中于消费类电子领域的Linux应用。CELF规范定义了一些功能的支持等级,如可扩展性、快速启动、片上执行以及电源管理等。开源开发实验室(Open Source Development Lab,OSDL,网址为www.osdl.org)则集中于电信级设备。OSDL的电信级Linux(Carrier Grade Linux,CGL)规范包含了对稳定性、高可用性、运行时补丁以及增强的错误恢复能力的诠释,这些问题在电信领域非常重要。

2、主线内核版本可能并未包含对用户所选择的嵌入式控制器的充分支持,即使控制器建立在内核所支持的CPU核心之上。但是,Linux发行版可能包含了控制器内部所有外设的设备驱动程序。

3、在内核开发过程中你计划使用的调试工具可能不包含在主线内核中。例如,内核并不包含内建的调试器支持。如果想在内核开发过程中使用内建的调试器,用户必须单独下载并打上相应的补丁。如果针对用户内核版本的测试过的补丁并不易用,用户必须忍受更多的麻烦。而发行版则包含了很多有用的调试功能,所以你可以立即开始使用它们。

4、一些发行版提供了法律补偿,让你的公司无须为任何由于内核bug所产生的诉讼承担责任。

5、发行版往往会对他们发布的内核进行较多的测试[③]。

6、 用户可以从内核发行版的供应商处购买到他们提供的服务以及软件包支持。

Linux内核目录

1)arch 。该目录包含了体系结构相关的文件。可以在 arch/ 目录下看到针对 ARM 、 Motorola 68K 、 s390 、 MIPS 、 Alpha 、 SPARC 、 IA64 等处理器的子目录。

(2)block。该目录主要包含块存储设备I/O调度算法的实现。

(3)cryto。该目录实现了密码操作以及加密相关的API,它们可被应用于WiFi设备驱动的加密算法等场合。

(4)Documentation。该目录包含了内核中各个子系统的简要描述,它将是你挖掘内核相关问题答案的第一站。

(5)drivers。这个目录包含了大量设备类和外设控制器的驱动,包括字符、串口、内置集成电路(Inter-Integrated Circuit , I2C)、个人计算机存储卡国际联盟(Personal ComputerMemory Card International Assciation , PCMCIA )、 外围组件互连(PeripheralComponent Interconnect ,PCI)、通用串行总线(Universal SerialBus, USB)、视频、音频、块、集成驱动电子设备(Integrated DriveElectronics ,IDE)、小型计算机系统接口(Small ComputerSystem Interface , SCSI )、CD-ROM、网络适配器、异步传输模式(AsynchronousTransfer Mode,ATM)、蓝牙和 内存技术设备(MemoryTechnologyDevice ,MTD)等。每一类设备对应drivers/下面的一个子目录,例如PCMCIA驱动的源代码位于drivers/pcmcia/目录,MTD驱动位于drivers/mtd/目录。drivers/下的这些子目录是本书的主要议题。

(6)fs。这个目录包含了EXT3、EXT4、reiserfs、FAT、VFAT、sysfs、procfs、isofs、JFFS2、XFS、NTFS和NFS等文件系统的实现。

(7)include。内核头文件位于此目录。该目录下以asm开头的子目录包含了体系结构相关的头文件,比如include/asm-x86/子目录包含了X86体系结构的头文件,include/asm-arm/包含了ARM体系结构的头文件。

(8)init。这个目录包含了从高层角度看到的初始化和启动代码。

(9)ipc。这个目录包含了对消息队列、信号、共享内存等进程间通信(IPC)机制的支持。

(10)kernel。本目录包含基本内核中体系结构无关的部分。

(11)lib。通用内核对象(kobject)处理、循环冗余校验(CRC)算法等库函数的实现位于此目录。

(12)mm。这个目录包含了内存管理的实现。

(13)net。该目录包含了网络协议,包括Internet协议第4版(IPv4)、IPv6、Internet网络分组交换协议(IPX)、蓝牙、ATM、红外、链路访问过程平衡(LAPB)以及逻辑链路控制(LLC)。

(14)scripts。内核编译过程中要使用的脚本位于此目录。

(15)security。这个目录包含了针对安全的框架。

(16)sound。Linux音频子系统位于此目录。

(17)usr。此目录包含了initramfs的实现。

代码阅读工具:

lxr

Linux交叉引用( lxr ),可从 http://lxr.sourceforge.net/ 下载,它可以让你通过 Web 浏览器浏览源代码,它为内核符号的定义和使用提供了超链接。

cscope(网址为http://cscope.sourceforge.net/ )可用于为内核源码树建立一个符号数据库,通过它,你可以快速地定位到声明、定义以及正则表达式等。 cscope 可能不如 lxr 这般多才多艺,但是它很灵活,使用你最喜欢的文本编辑器(而不是浏览器)你就可以使用搜索功能。在内核源代码的根目录,运行 cscope - qkRv 命令就可建立交叉引用数据库。 - q 选项将产生更多的索引信息以加快搜索速度,但是它会消耗更多的额外的初始启动时间。 -k 要求 cscope 调整它的行为以适应内核源代码, - R 选项意味着递归遍历子目录。通过 man 手册页,你可以获得详细的调用语法。

不要哭,你要努力地往前看,你要相信阳光总在风雨后,你最终会看到彩虹的。

《Essential Linux Device Drivers》linux那些事

相关文章:

你感兴趣的文章:

标签云: