首次閱讀Linux4.0.5內核源代碼時,一臉茫然,它的代碼不只複雜,並且龐大,找不到從哪裏開始閱讀。
一般Linux會有如下目錄
- arch 子目錄包括全部和體系結構相關的核心代碼。它還有更深的子目錄,每個表明一種支持的體系結構
- include 子目錄包括編譯核心所須要的大部分 include 文件。它也有更深的子目錄,每個支持的體系結構一個。 include/asm 是這個體系結構所須要的真實的 include 目錄的軟連接,例如 include/asm-i386 。爲了改變體系結構,你須要編輯核心的 makefile ,從新運行 Linux 的核心配置程序
- init 這個目錄包含核心的初始化代碼,這時研究核心如何工做的一個很是好的起點
- mm 這個目錄包括全部的內存管理代碼。和體系結構相關的內存管理代碼位於 arch/*/mm/
- drivers 系統全部的設備驅動程序在這個目錄。它們被劃分紅設備驅動程序類
- ipc 這個目錄包含核心的進程間通信的代碼
- modules 這只是一個用來存放創建好的模塊的目錄
- fs 全部的文件系統代碼。被劃分紅子目錄,每個支持的文件系統一個
- kernel 主要的核心代碼。一樣,和體系相關的核心代碼放在 arch/*/kernel
- net 核心的網絡代碼
- lib 這個目錄放置核心的庫代碼。和體系結構相關的庫代碼在 arch/*/lib/
- scripts 這個目錄包含腳本(例如 awk 和 tk 腳本),用於配置核心
按照如下順序閱讀源代碼會輕鬆點
- 核心功能(kernel)
- 內存管理(mm)
- 文件系統(fs)
- 進程通信(ipc)
- 網絡(net)
- 系統啓動和初始化(init/main和head.S)
- 其餘等等
System Startup and Initialization (系統啓動和初始化)html
在一個 Intel 系統上,當 loadlin.exe 或 LILO 把核心加載到內存並把控制權交給它的時候,核心開始啓動。這一部分看 arch/i386/kernel/head.S 。 head.S 執行一些和體系結構相關的設置工做並跳到 init/main.c 中的 main() 例程。
Memory Management (內存管理)linux
代碼大多在 mm 可是和體系結構相關的代碼在 arch/*/mm 。 Page fault 處理代碼在 mm/memory.c 中,內存映射和頁緩存代碼在 mm/filemap.c 中。 Buffer cache 在 mm/buffer.c 中實現,交換緩存在 mm/swap_state.c 和 mm/swapfile.c 中。
Kernelios
大部分相對通用的代碼在 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 (設備驅動程序) socket
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 (文件系統) ide
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 (網絡)spa
網絡代碼放在 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 (模塊) htm
核心模塊代碼部分在覈心,部分在 modules 包中。核心代碼所有在 kernel/modules.c ,數據結果和核心守護進程 kerneld 的消息則分別在 include/linux/module.h 和 include/linux/kerneld.h 中。你可能也但願在 include/linux/elf.h 中查看一個 ELF 目標文件的結構
參考