LINUX 核心 之 (第13章)
第13章
本章介绍Linux原代码的组织。从而有兴趣的读者可以阅读原码。
本书并不要求读者具有C语言的经验和必须手边有Linux原代码。然而阅读原代码对理解Linux操作系统的一个
非常好的练习方法。本章给出一个核心原码的综述和其目录组织。
从哪哩得到Linux Kernel 原码
(译者注:这里略去原作者有点旧的一段。)
通常来讲,读者可以访问:www.redhat.com 得到Linux系统。另外我们强烈鼓励读者访问:www.linuxhq.com
和www.linux.com
Linux核心原码版本组织是一个简单的编码系统。任何偶数编码的核心版本(如2.0.30)都是一个稳定的,正式
发布的版本。任何齐数的版本表示其是一个正在开发中的核心。本书基于2.0.30核心版本。我们鼓励用户尝
试开发中的版本。从而整个Linux“社区”可以来测试最新的代码。
核心代码的变动词藏以patch的形式发布。Linux提供一个实用命令patch来对原代码进行更新。例如,你当前
有一个2.0.29的原码但想要更新到2.0.30上。你要做的是:得到2.0.30的path文件并相应地将你的原码更新.
$ cd /usr/src/linux
$ patch -p1 < patch-2.0.30
这样你就不需要从新拷贝所有的原码。一个非常好的提供核心patch站点是:www.linuxhq.com。
核心原码的组织
在Linux原码的根目录/usr/src/linux下,你可以看见许多目录:
arch 该目录下放着所有的与体系结构有关的核心代码。该目录下还包含其它子目录分别对应不同的体系结构
。例如,i386和Alpha。
include 该目录下放着系统构建所需的大多数include文件。它也包含一些对应于不同体系结构的子目录。
include/asm子目录是一个软连接,其真正指向的是对应于一个体系结构的目录,例如,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 该目录含有一些scripts工具,如awk和tk等等。核心构建时用得着。
从哪开始了解Linux核心
阅读象Linux核心这样一个巨大的复杂的系统是令人畏缩的。下面提供一些好的建议和介绍,
从而使得读者的阅读更容易一些。
系统初启和初始化
对于基于Intel的系统,当loadlin.exe或LILO将核心装载进入内存中并将控制交给核心时,
核心进入开始阶段。请阅读 arch/i386/kernel/head.S关于上述过程。Head.S做一些与体系结构
相关的设置工作,然后跳转到init/main.c中的main()函数。
内存管理
大多数代码在mm目录中。少量与体系结构有关的在arch/*/mm中。页面错处理代码在mm/memory.c
中。内存映象和页面缓冲代码在mm/filemap.c中。缓冲区cache代码在mm/buffer.c中。对换
缓冲代码在mm/swap_state.c中。
核心
大多数通用的代码在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/pic.c中。系统定义在include/linux/pci.h中。每中结构有其特定
的PCI BIOS代码。Alpha AXP的部份在arch/alpha/kernel/bios32.c中。
进程间通信
进程间通信所有的代码都在ipc目录中。所有的System V IPC对象包括一个ipc_perm数据结构。
其定义在include/linux/ipc.h中。System V消息传递(message)的实现在ipc/msg.c中。共享内存
(shared memory)在ipc/shm.c中。信号灯(semaphores)在ipc/sem.c中。管道在ipc/pipe.c中。
中断处理
核心中中断处理的代码基本上是与特定的硬件体系结构相关的。Intel的中断处理代码在
arch/i386/kernel/irq.c中。其定义在include/asm-i386/irq.h中。
设备驱动程序
绝大多数Linux核心代码是关于设备驱动程序。所有的Linux设备驱动程序原码在drivers子目录中。
并且分为下列次子目录:
/block
块设备驱动程序,如ide.c。如果你想看所有可能含有文件系统的设备的初始化,你应该看
drivers/block/genhd.c中的device_setup()函数。该初始化过程不仅对硬盘,也对网络初始化因为
我们需要网络来“mount” nfs文件系统。块设备包含基于IDE和SCSI的设备。
/char
字符设备如ttys,串行口和鼠标等。
/cdrom
Linux关于CDROM的代码。请注意关于IDE CDROM的代码在drivers/block的ide-cd.c中。SCSI CD的
代码在drivers/scsi下的scsi.c中。
/pci
PCI伪驱动程序的代码。
/scsi
含有所有的SCSI代码和Linux所支持的SCSI设备驱动程序
/net
网络代码。
/sound
支持声卡的驱动程序。
文件系统
为EXT2文件系统的原码在fs/ext2目录下。其数据结构定义在include/linux/ext2_fs.h,
ext2_fs.h和ext2_fs_sb.h。虚拟文件系统数据结构定义在include/linux/fs.h。相应
代码在fs/*。缓冲区代码在fs/buffer.c。核心监控程序update也在这里。
网络
网络代码的include文件在include/net中。BSD socket代码在net/socket.c中。IP版本4
INET socket代码在net/ipv4/af_inet.c中。协议的一些通用代码(包含sk_buff处理例程)
在net/core中。TCP/IP网络代码在net/ipv4中。网络设备驱动程序在drivers/net中。
模块
核心模块代码一部份在核心中,一部份在modules包中。核心中的部份在kernel/modules.c中。
其数据结构和kerneld核心监控程序定义在include/linux/module.h和include/linux/herneld.h
中。include/linux/elf.h中定义了ELF文件的结构格式。
发布人:netbull 来自:linuxeden