熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Linux Kernel核心中文手冊 (13)

2013-11-13 16:12:23  來源: Oracle 

  The Linux Kernel Sources ( Linux 核心源程序)
  
  本章描述了你應該在 Linux 核心源程序的什麼地方開始查看特定的核心功能
  
  本書不依賴 C 語言的知識或要求你有 Linux 核心源程序才能理解 Linux 核心如何工作而是說練習查看核心源程序能夠對於 Linux 操作系統有一個深入地理解本章給出核心源程序的概覽它們如何組織你應該從哪裡開始查找特定的代碼
  
  Where to Get The Linux Kernel Sources (從哪裡得到 Linux 核心源程序)
  
  所有的主要的 Linux 分發( Craftworks Debian Slackware RedHat 等等)中間都有核心源程序通常 L 安裝在你的 Linux 系統上的 Linux 核心都是用這些源程序建立的實際上這些源程序顯得有些過時所以你可能希望得到附錄 C 提到的 web 站點得到最新的源程序它們放在 ftp://ftpcshelsinkifi 和其它所有的鏡像的 web 站點 Helsinki 的 web 站點最新但是其它站點例如 MIT 和 Sunsite 也不會太落後
  
  如果你無法訪問 web 還有許多 CDROM 廠家用非常合理的費用提供世界主要 web 站點的塊找一些甚至提供預訂服務按季或月進行更新你的本地的 Linux 用戶組也是一個源程序的好的來源
  
  Linux 核心源程序有一個非常簡單的編號系統任何偶數的核心(例如 )都是一個穩定的發行的核心而任何奇數的核心(例如 )都是一個開發中的核心本書基於穩定的 源代碼開發版的核心具有所有的最新特點和所有最新的設備的支持但是它們可能不穩定可能不是你所要的但是讓 Linux 社團測試最新核心是很重要的這樣可以讓整個社團都進行測試記住即使你測試非生產用核心最好也要備份你的系統
  
  對於核心源程序的改動作為 patch 文件分發工具 patch 可以對於一系列源文件應用一系列修改例如如果你有 的源程序樹而你希望轉移到 你可以取到 的 patch 文件並把這些 patch (編輯)應用到源程序樹上
  
  $ cd /usr/src/linux
  
  $ patch p < patch-2.0.30
  
  這樣可以不用拷貝整個源程序樹,特別對於慢速的串行連接。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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.