欣欣工作室——带你走进单片机世界

         
累计访问4190770
当前在线108
首   页 | 常用器件 | 问答集萃 | 技术文摘 | 在线学习 | 共享工程 | 资料下载 | 网友交流

 
Web xinworks
第1章 硬件基础知识
第2章 软件基础
第3章 内存管理
第4章 进程
第5章 进程间通讯机制
第6章 PCI
第7章 中断和中断处理
第8章 设备驱动程序
第9章 文件系统
第10章 网络
第11章 核心机制
第12章 模块
第13章 核心源程序
第14章 数据结构
第15章 Alpha AXP处理器

Linux Kernel核心中文手册


Chapter 13 The Linux Kernel Sources ( Linux 核心源程序)

本章描述了你应该在 Linux 核心源程序的什么地方开始查看特定的核心功能。

本书不依赖‘ C ’语言的知识或要求你有 Linux 核心源程序才能理解 Linux 核心如何工作。而是说,练习查看核心源程序能够对于 Linux 操作系统有一个深入地理解。本章给出核心源程序的概览:它们如何组织,你应该从哪里开始查找特定的代码。

Where to Get The Linux Kernel Sources (从哪里得到 Linux 核心源程序)

所有的主要的 Linux 分发( Craftworks , Debian , Slackware , RedHat 等等)中间都有核心源程序。通常 L 安装在你的 Linux 系统上的 Linux 核心都是用这些源程序建立的。实际上这些源程序显得有些过时,所以你可能希望得到附录 C 提到的 web 站点得到最新的源程序。它们放在 ftp://ftp.cs.helsinki.fi 和其它所有的镜像的 web 站点。 Helsinki 的 web 站点最新,但是其它站点例如 MIT 和 Sunsite 也不会太落后。

如果你无法访问 web ,还有许多 CDROM 厂家用非常合理的费用提供世界主要 web 站点的块找。一些甚至提供预订服务,按季或月进行更新。你的本地的 Linux 用户组也是一个源程序的好的来源。

Linux 核心源程序有一个非常简单的编号系统。任何偶数的核心(例如 2.0.30 )都是一个稳定的发行的核心,而任何奇数的核心(例如 2.1.42 )都是一个开发中的核心。本书基于稳定的 2.0.30 源代码。开发版的核心具有所有的最新特点和所有最新的设备的支持,但是它们可能不稳定,可能不是你所要的,但是让 Linux 社团测试最新核心是很重要的。这样可以让整个社团都进行测试。记住,即使你测试非生产用核心,最好也要备份你的系统。

对于核心源程序的改动作为 patch 文件分发。工具 patch 可以对于一系列源文件应用一系列修改。例如,如果你有 2.0.29 的源程序树,而你希望转移到 2.0.30 ,你可以取到 2.0.30 的 patch 文件,并把这些 patch (编辑)应用到源程序树上:

$ cd /usr/src/linux

$ patch -p1 < patch-2.0.30

这样可以不用拷贝整个源程序树,特别对于慢速的串行连接。一个核心补丁(正式和非正式的)的好来源是 http://www.linuxhq.com

How The Kernel Sources Are Arranged (核心源程序如何组织)

在源程序树的最上层你会看到一些目录:

arch arch 子目录包括所有和体系结构相关的核心代码。它还有更深的子目录,每一个代表一种支持的体系结构,例如 i386 和 alpha 。

Include include 子目录包括编译核心所需要的大部分 include 文件。它也有更深的子目录,每一个支持的体系结构一个。 Include/asm 是这个体系结构所需要的真实的 include 目录的软链接,例如 include/asm-i386 。为了改变体系结构,你需要编辑核心的 makefile ,重新运行 Linux 的核心配置程序

Init 这个目录包含核心的初始化代码,这时研究核心如何工作的一个非常好的起点。

Mm 这个目录包括所有的内存管理代码。和体系结构相关的内存管理代码位于 arch/*/mm/ ,例如 arch/i386/mm/fault.c

Drivers 系统所有的设备驱动程序在这个目录。它们被划分成设备驱动程序类,例如 block 。

Ipc 这个目录包含核心的进程间通讯的代码

Modules 这只是一个用来存放建立好的模块的目录

Fs 所有的文件系统代码。被划分成子目录,每一个支持的文件系统一个,例如 vfat 和 ext2

Kernel 主要的核心代码。同样,和体系相关的核心代码放在 arch/*/kernel

Net 核心的网络代码

Lib 这个目录放置核心的库代码。和体系结构相关的库代码在 arch/*/lib/

Scripts 这个目录包含脚本(例如 awk 和 tk 脚本),用于配置核心

Where to Start Looking (从哪里开始看)

看像 Linux 核心这么巨大复杂的程序相当困难。它就像一个巨大的线球,显示不出终点。看核心的一部分代码通常会引到查看其它几个相关的文件,不就你就会忘记你看了什么。下一节给你一个提示,对于一个给定的主题,最好看源程序树的那个地方。

System Startup and Initialization (系统启动和初始化)

在一个 Intel 系统上,当 loadlin.exe 或 LILO 把核心加载到内存并把控制权交给它的时候,核心开始启动。这一部分看 arch/i386/kernel/head.S 。 head.S 执行一些和体系结构相关的设置工作并跳到 init/main.c 中的 main() 例程。

Memory Management (内存管理)

代码大多在 mm 但是和体系结构相关的代码在 arch/*/mm 。 Page fault 处理代码在 mm/memory.c 中,内存映射和页缓存代码在 mm/filemap.c 中。 Buffer cache 在 mm/buffer.c 中实现,交换缓存在 mm/swap_state.c 和 mm/swapfile.c 中。

Kernel

大部分相对通用的代码在 kernel ,和体系结构相关的代码在 arch/*/kernel 。调度程序在 kernel/sched.c , fork 代码在 kernel/fork.c 。 bottom half 处理代码在 include/linux/interrupt.h 。 task_struct 数据结构可以在 include/linux/sched.h 中找到

PCI

PCI 伪驱动程序在 drivers/pci/pci.c ,系统范围的定义在 include/linux/pci.h 。每一种体系结构都有一些特殊的 PCI BIOS 代码, Alpha AXP 的位于 arch/alpha/kernel/bios32.c

Interprocess Communication

全部在 ipc 目录。所有系统 V IPC 对象都包括 ipc_perm 数据结构,可以在 include/linux/ipc.h 中找到。系统 V 消息在 ipc/msg.c 中实现,共享内存在 ipc/shm.c 中,信号灯在 ipc/sem.c 。管道在 ipc/pipe.c 中实现。

Interrupt Handling

核心的中断处理代码几乎都是和微处理器(通常也和平台)相关。 Intel 中断处理代码在 arch/i386/kernel/irq.c 它的定义在 incude/asm-i386/irq.h 。

Device Drivers (设备驱动程序)

Linux 核心源代码的大部分代码行在它的设备驱动程序中。 Linux 所有的设备驱动程序源代码都在 drivers 中,但是它们被进一步分类:

/block 块设备驱动程序比如 ide ( ide.c )。如果你希望查看所有可能包含文件系统的设备是如何初始化的,你可以看 drivers/block/genhd.c 中的 device_setup() 。它不仅初始化硬盘,也初始化网络,因为你安装 nfs 文件系统的时候需要网络。块设备包括基于 IDE 和 SCSI 设备。

/char 这里可以查看基于字符的设备比如 tty ,串行口等。

/cdrom Linux 所有的 CDROM 代码。在这里可以找到特殊的 CDROM 设备(比如 Soundblaster CDROM )。注意 ide CD 驱动程序是 drivers/block 中的 ide-cd.c ,而 SCSI CD 驱动程序在 drivers/scsi/scsi.c 中

/pci PCI 伪驱动程序。这是一个观察 PCI 子系统如何被映射和初始化的好地方。 Alpha AXP PCI 整理代码也值得在 arch/alpha/kernel/bios32.c 中查看

/scsi 在这里不但可以找到所有的 Linux 支持的 scsi 设备的驱动程序,也可以找到所有的 SCSI 代码

/net 在这里可以找到网络设备驱动程序比如 DEC Chip 21040 PCI 以太网驱动程序在 tulip.c 中

/sound 所有的声卡驱动程序的位置

File Systems (文件系统)

EXT2 文件系统的源程序都在 fs/ext2/ 子目录,数据结构的定义在 include/linux/ext2_fs.h,ext2_fs_i.h 和 ext2_fs_sb.h 中。虚拟文件系统的数据结构在 include/linux/fs.h 中描述,代码是 fs/* 。 Buffer cache 和 update 核心守护进程都是用 fs/buffer.c 实现的

Network (网络)

网络代码放在 net 子目录,大部分的 include 文件在 include/net 。 BSD socket 代码在 net/socket.c , Ipv4 INET socket 代码在 net/ipv4/af_inet.c 中。通用协议的支持代码(包括 sk_buff 处理例程)在 net/core 中, TCP/IP 网络代码在 net/ipv4 。网络设备驱动程序在 drivers/net

Modules (模块)

核心模块代码部分在核心,部分在 modules 包中。核心代码全部在 kernel/modules.c ,数据结果和核心守护进程 kerneld 的消息则分别在 include/linux/module.h 和 include/linux/kerneld.h 中。你可能也希望在 include/linux/elf.h 中查看一个 ELF 目标文件的结构




粤ICP备06035157号