当前位置:Linux教程 - Linux - LINUX 核心 之 (第13章)

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