The Linux Kernel Sources ( Linux 核心源程序)
本章描述了你應該在 Linux 核心源程序的什麼地方開始查看特定的核心功能
本書不依賴
Where to Get The Linux Kernel Sources (從哪裡得到 Linux 核心源程序)
所有的主要的 Linux 分發( Craftworks
如果你無法訪問 web
Linux 核心源程序有一個非常簡單的編號系統
對於核心源程序的改動作為 patch 文件分發
$ cd /usr/src/linux
$ patch
這樣可以不用拷貝整個源程序樹,特別對於慢速的串行連接。TW.wiNGwIT.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 目標文件的結構
From:http://tw.wingwit.com/Article/program/Oracle/201311/17961.html