Linux核心源碼閱讀方法

首次閱讀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 腳本),用於配置核心
按照如下順序閱讀源代碼會輕鬆點
  1. 核心功能(kernel) 
  2. 內存管理(mm) 
  3. 文件系統(fs)
  4. 進程通信(ipc)
  5. 網絡(net)
  6. 系統啓動和初始化(init/main和head.S)
  7. 其餘等等
 

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 目標文件的結構 
 

 

參考

Linux內核源代碼: http://www.kernel.org/
深刻分心Linux內核源代碼: http://oss.org.cn/kernel-book/
Linux的有關參考資料: http://www.oldlinux.org/index_cn.html
相關文章
相關標籤/搜索