《精通Linux设备驱动程序开发》——1.6 查看源代码

1.6 查看源代码

在研究内核源代码之前,让我们先下载Linux源代码,学会打补丁,并查看内核源码树的布局。

首先,请到www.kernel.org 下载最新的稳定的源代码[源代码以gzip(.zip)和bzip2 (.bz2)两种压缩格式提供],之后请进行解压缩。在下列命令中,请用最新的内核版本号(譬如)代替X.Y.Z:

bash> cd /usr/src
bash> wget www.kernel.org/pub/linux/kernel/vX.Y/linux-X.Y.Z.tar.bz2
...
bash> tar xvfj linux-X.Y.Z.tar.bz2

现在,你已经拥有位于/usr/src/linux-X.Y.Z/目录的源代码树,下面通过打-mm补丁(Andrew Morton)启动一些实验性测试特性。运行如下命令:

bash> cd /usr/src
bash> wget www.kernel.org/pub/linux/kernel/people/akpm/patches/X.Y/X.Y.Z/X.Y.Z-
mm2/X.Y.Z-mm2.bz2

打上这个补丁:

bash> cd /usr/src/linux-X.Y.Z/
bash> bzip2 -dc ../X.Y.Z-mm2.bz2 | patch -p1

命令中的-dc选项意味着让bzip2将指定的文件解压缩到标准输出。它被以管道方式输送到补丁实用程序,补丁程序会将补丁中的代码修改应用到源码树中的每个需要修改的文件。

如果你需要打多个补丁,请注意要采取正确的顺序。为了生成一个包含X.Y.Z-aa-bb补丁的内核,应首先下载X.Y.Z内核的完整源代码,再打上X.Y.Z-aa补丁,最后打上X.Y.Z-aa-bb补丁。

补丁提交
使用diff命令可以为你更改的内核产生补丁:

bash> diff –Nur /path/to/original/kernel /path/to/your/kernel > changes.patch

要注意的是,在diff命令中,原始内核的路径应该放在修改后内核路径的前面。基于2.6内核补丁提交的公约,你需要在补丁的最后加上这样的一行:

Signed-off-by: Name <Email>
这一行阐明了这些代码是由你编写的,你拥有贡献它的权利。

你现在就可以在相关的邮件列表(如LKML)中张贴你的补丁了。

文档Documentation/SubmittingPatches包含了一个创建和提交补丁的向导,而Documen- tation/applying-patches.txt是一个教你如何打补丁的教程。
现在,你打好补丁后的/usr/src/linux-X.Y.Z/已经准备好投入使用了。接下来,我们花一些时间来查看内核源代码树的结构。进入内核源代码树的根目录并列出它的子目录。

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

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

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

(4) Documentation。该目录包含了内核中各个子系统的简要描述,它是你探究内核方面问题的第一站。

(5) drivers。这个目录包含了大量设备类和外设控制器的驱动,包括字符、串口、内置集成电路(I)、个人计算机存储卡国际联盟(PCMCIA)、外围组件互连(PCI)、通用串行总线(USB)、视频、音频、块、集成驱动电子设备(IDE)、小型计算机系统接口(SCSI)、CD-ROM、网络适配器、异步传输模式(ATM)、蓝牙和内存技术设备(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、网际互联交换协议(IPX)、蓝牙、ATM、红外、链路访问过程平衡(LAPB)以及逻辑链路控制(LLC)。

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

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

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

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

统一的x86架构源码树

从内核版本开始,i386和x86_64(与32位的i386系统对应的64位系统)架构源码树已被统一纳入公共的arch/x86/目录。如果你使用的是比2.6.24老的内核,请用arch/i386 /代替本书中所说的arch/x86 /目录。同样地,也请将include/asm-x86/替换为include/asm-i386/。此外,这些目录中的一些文件名也会有所不同。
在这么庞大的目录树中查找符号和代码是一项艰巨的任务,表1-1中的一些工具可以帮助你更方便地浏览内核源码树。

时间: 2024-11-02 11:57:41

《精通Linux设备驱动程序开发》——1.6 查看源代码的相关文章

《精通Linux设备驱动程序开发》——1.9 整装待发

1.9 整装待发 Linux已经涉及的领域十分广泛,代表着最新的技术水平,所以可以基于它来学习操作系统的概念.处理器体系架构,甚至了解各种行业领域.在学习某一设备驱动程序子系统用到的技术时,不妨在更深层次上探索其背后的设计动机. 在没有明确指明的情况下,本书默认的都是32位x86架构.但是,本书也考虑到你更有可能要为嵌入式设备而非传统的PC兼容的系统编写驱动程序.因此,第6章讲解了两种设备:一个PC衍生器件上的触摸控制器和一个手机上的UART.第8章则讲解了PC系统中的EEPROM和嵌入式设备中

《精通Linux设备驱动程序开发》——1.5 Linux发行版

1.5 Linux发行版 一个GNU/Linux系统除了内核以外,还包括大量的实用程序.程序.库和工具,因此,获得和正确安装所有的组件是一项艰巨的任务.而Linux发行版有序地将这些组件进行了分类,并捆绑成相应的包,从而分担了这一艰巨任务.一个常见的发行版包含数以千计的捆绑好的包.这使得用户无需担心下载不到正确版本的程序,也无需关心程序间的依赖问题. 因为打包是GNU许可证范围内的一种有效的赚钱方式,因此,目前的市场上诞生了数个Linux发行版.其中,Red Hat/Fedora.Debian.

《精通Linux设备驱动程序开发》——1.4 邮件列表和论坛

1.4 邮件列表和论坛 LKML(Linux Kernel Mailing List,内核邮件列表)是开发人员就开发问题进行辩论并决定Linux未来要包含哪些功能的论坛.Linux内核目前包含世界各地的成千上万的开发人员贡献的数百万行代码,正是LKML将这些开发人员联结在一起. LKML的定位不在于解答一般的Linux问题,其基本规则是只能张贴以前没有被回答过并且在众所周知的文档中没有提及的内核问题.如果你编译Linux应用程序的时候C编译器崩溃了,你应该去其他地方张贴这样的问题. LKML中的

《精通Linux设备驱动程序开发》——1.8 可加载的模块

bash> cd /usr/src/linux-X.Y.Z/ bash> make modules 运行如下命令安装编译生成的模块: bash> make modules_install此命令将在/lib/modules/X.Y.Z/kernel/目录下构造一个内核源代码目录结构,并将可加载的模块放入其中.它也将激活depmod实用程序,以便生成模块依赖文件/lib/modules/X.Y.Z/modules.dep. 如下工具可用于操纵模块:insmod.rmmod.lsmod.mod

《精通Linux设备驱动程序开发》——第1章 引言 1.1演进

第1章 引言 Linux具有诱人的魅力,它是一个由全世界不同民族.不同信仰.不同性别的人共同参与和协作的国际性项目.Linux免费提供源代码,并且具有与Unix类似的为人们所熟悉的应用程序编程环境,这一切造就了它今天的巨大成功.通过互联网从专家处即时获得的高质量的免费支持也发挥了重要作用,它促成了一个庞大的Linux社区. 在技术方面,开发人员可以获得所有源码,并由此得出一些创新方案,他们因此感到无比振奋.譬如,你可以修改(hack)[1] Linux的源码,并做定制,让设备在几秒钟之内启动,而

《精通Linux设备驱动程序开发》——1.3 kernel.org

1.3 kernel.org Linux内核源代码主要存放在www.kernel.org.该网站包含所有已经发布的内核版本,世界各地有大量的kernel.org镜像网站. 除了已经发布的内核以外,kernel.org还包含了由一线开发人员提供的补丁,这些补丁可以作为未来稳定版本的试验平台.补丁是一种文本文件,包含了新开发版本和开发之初制订的原始版本之间的源码差异.由Linux内核第一维护人Andrew Morton定期提供的-mm补丁是一种很受欢迎的补丁.在该补丁中,我们可以找到在主线源代码树中

《精通Linux设备驱动程序开发》——1.7 编译内核

1.7 编译内核 了解了内核源码树布局后,现在我们来对代码稍做修改,并编译和运行它.进入位于顶层的init/目录,对初始化文件main.c做一项小的修改,即在start_kernel()函数的开头加上一行打印信息,宣布你对北极熊的喜爱: asmlinkage void __init start_kernel(void) { char *command_line; extern struct kernel_param __start___param[], __stop___param[]; + p

《精通Linux设备驱动程序开发》——1.2 GNU Copyleft

1.2 GNU Copyleft GNU工程比Linux更早诞生,发起它的目标是定制一个免费的类Unix操作系统(GNU是GNU's Not Unix的递归缩写,意为"GNU不是Unix".一个完整的GNU操作系统基于Linux内核构建,但也包含一些其他组件,如库.编译器和实用程序(utility).因此,基于Linux的计算机的更准确称呼应该是GNU/Linux系统.GNU/Linux系统的所有组成部分都建立在免费软件之上. 免费软件有许多种,其中的一种是公共领域(public do

为系统处理器编写Linux设备驱动程序

引 言 编写 Linux 设备驱动程序无疑是一项复杂的工作.本文将集中介绍非标准硬件的设备驱动程序编写,探讨硬件应用编程接口,并借用 Cirrus Logic EP9312 片上系统嵌入式平台添加设备驱动程序这一案例来进行分析. 如果有些编程内容未能在本文中涉及,那么读者亦可以查阅相似的设备驱动程序编码,以做参考.还有一种方法,就是检索历史档案或者向 Linux 内核问讯中心去函问讯. Linux 概述 Linux 是 UNIX 操作系统的翻版,1991 年由 Linus Torvalds 最先