第13章

本章介紹Linux原始碼的組織。從而有興趣的讀者可以閱讀原始碼。
本書並不要求讀者具有C語言的經驗和必須手邊有Linux原始碼。然而閱讀原始碼對理解Linux作業系統的一個
非常好的練習方法。本章給出一個核心原始碼的綜述和其目錄組織。
從哪裡得到Linux Kernel 原始碼
(譯者注:這裡略去原作者有點舊的一段。)
通常來講,讀者可以存取:www.redhat.com 得到Linux系統。另外我們強烈鼓勵讀者存取:http://www.linuxhq.com
和http://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檔案的結構格式。