第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檔案的結構格式。