歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> linux bible 第十四章 Linux核心資源

linux bible 第十四章 Linux核心資源

日期:2017/2/27 9:46:39   编辑:更多Linux
  第十四章 Linux核心資源 本章主要描敘尋找某個特殊核心函數時用到的Linux核心資源。 本書並不要求讀者具有C編程語言的能力或者擁有Linux核心源代碼來理解Linux核心 工作原理。但是如果對核心源代碼進行閱讀將加深對Linux操作系統的理解。本章提 供了一個核心源代碼的綜述。 從哪裡得到Linux核心源碼 所有主要Linux分發版本(如Craftworks,Debian,Slackware,Redhat)都包含了 源碼在內。通常安裝在你的Linux系統核心就是從這些源碼中構造出來的。由於一些 顯然的因素,這些源碼都或多或少有點過期。你可以在www-appendix一章中的那些 WEB站點中得到最新的版本。這些站點包括FTP://ftp.cs.helsinki.fi以及所有其他 鏡象站點中。helsinki的這個WEB站點上的Linux源碼顯然是最新的但是M99v和Sunsite 的也不會差太遠。 如果你無法訪問這些WEB站點,有許多CDROM廠商以非常合理的價格提供了這些WEB站 點的鏡象光盤。有些廠商還提供每季度甚至每個月更新的訂購服務。另外你所在的本 地Linux用戶組也是一個很好的資源。 Linux核心代碼的版本編號很簡單。任何偶數編號的核心(如2.0.30)都是穩定的發 行版而記數編號的核心(如2.1.42)都是正在開發的核心。本書基於穩定的2.0.30版 本。開發版的核心具有所有最新的特征並支持最新的設備。盡管它們不是你所希望的 那樣穩定,但是對於Linux用戶團體來說試用新核心是非常重要的。因為他們將完成 這些評測工作。當試用非發行版本核心時備份系統總是有好處的。 核心的修改以patch文件來分發。而patch實用程序被用來對一些核心源碼進行編輯。 例如如果現在你已經有了2.0.39的核心代碼但是你想升級到2.0.30,那麼你在取得 2.0.30補丁文件後可以實用以下命令來修改現存核心: $ cd /usr/src/linux $ patch -p1 < patch-2.0.30 一個收集核心補丁的站點是http://www.linuxhq.com。 核心源碼的組織 核心源碼的頂層是/usr/src/linux目錄,在此目錄下你可以看到大量子目錄: arch 這個子目錄包含了所有體系結構相關的核心代碼。它還包含每種支持的體系 結構的子目錄,如i386。 include 這個目錄包括了用來重構核心的大多數include文件。對於每種支持的體系結 構分別有一個子目錄。 此目錄中的asm子目錄中是對應某種處理器的符號連接,如include/asm-i386。 要修改處理器結構則只需編輯核心的makefile並重新運行Linux核心配置程序。 init 此目錄包含核心啟動代碼。 mm 此目錄包含了所有的內存管理代碼。與具體體系結構相關的內存管理代碼位 於arch/*/mm目錄下,如arch/i386/mm/fault.c 。 drivers 系統中所有的設備驅動都位於此目錄中。它又進一步劃分成幾類設備驅動,如blo ck。 ipc 此目錄包含了核心的進程間通訊代碼。 modules 此目錄僅僅包含已建好的模塊。 fs 所有的文件系統代碼。它也被劃分成對應不同文件系統的子目錄,如vfat和ext2。 kernel 主要核心代碼。同時與處理器結構相關代碼都放在arch/*/kernel目錄下。 net 核心的網絡部分代碼。 lib 此目錄包含了核心的庫代碼。與處理器結構相關庫代碼被放在arch/*/lib/目錄下 。 scripts 此目錄包含用於配置核心的腳本文件(如awk和tk腳本)。


從哪裡入手 閱讀象Linux核心代碼這樣的復雜程序令人望而生畏。它象一個越滾越大的雪球。閱讀 核心某個部分經常要用到好幾個其他的相關文件,不久你將會忘記你原來在干什麼。 本小節將給出一些提示。 系統啟動與初始化 在基於intel的系統上,Linux可以通過loadlin.exe或者LILO將核心載入內存並將控 制傳遞給它。這部分程序位於arch/i386/kerneld/head.S。此文件完成一些處理器 相關操作並跳轉到init/main.c中的main()例程。 內存管理 這部分代碼主要位於mm目錄中但其處理器結構相關部分被放在arch/*/mm中。頁面出 錯處理代碼位於mm下的memory.c文件中而內存映射與頁面cache代碼位於filemap.c中。 buffer cache則在mm/buffer.c中實現, swap cache位於mm/swap_state.c和 mm/swapfile.c中。 核心 大多數通用代碼位於kernel目錄下而處理器相關代碼被放在arch/*/kernel中。調度器 位於kernel/sched.c而fork代碼位於kernel/fork.c中。底層部分處理代碼位於 include/linux/interrupt.h中。task_strUCt的描敘則在/linux/sched.h中可以找到。 PCI PCI偽設備驅動位於drivers/pci/pci.c且其系統通用定義放在include/linux/pci.h中。 每個處理器結構具有特殊的PCI BIOS代碼,Alpha AXP的位於arch/alpha/kernel/bios3 2.c?nbsp; 。 進程間通訊 所有這些代碼都在ipc目錄中。系統VIPC對象都包含一個ipc_perm結構,它在 include/linux/ipc.h中描敘。系統V消息在ipc/msg.c中實現,共享內存在ipc/shm.c 而信號燈位於ipc/sem.c中。管道在ipc/pipe.c中實現。 中斷處理 核心的中斷處理代碼總是與微處理器結構相關。Intel系統的中斷處理代碼位於 arch/i386/kernel/irq.c中,其定義位於include/asm-i386/irq.h中。 設備驅動 Linux核心源碼的大多數都是設備驅動。所有Linux的設備驅動源碼都放在drivers目 錄中並分成以下幾類: /block 塊設備驅動包括IDE(在ide.c中)驅動。如果你想尋找這些可包含文件系統的設 備的初始化過程則應該在drivers/block/genhd.c中的device_setup()。當安裝 一個nfs文件系統時不但要初始化硬盤還需初始化網絡。塊設備包括IDE與SCSI設備 。 /char 此目錄包含字符設備的驅動,如ttys,串行口以及鼠標。 /cdrom 包含所有Linux CDROM代碼。在這裡可以找到某些特殊的CDROM設備 (如Soundblaster CDROM)。 IDE接口的CD驅動位於drivers/block/ide-cd.c 中而SCSI CD驅動位於drivers/scsi/scsi.c中。 /pci 它包含了PCI偽設備驅動源碼。這裡可以找到關於PCI子系統映射與初始化的代 碼。另外位於arch/alpha/kernel/bios32.c中的Alpha AXP PCI補丁代碼也值得一 讀。 /scsi 這裡可以找到所有的SCSI代碼以及Linux支持的SCSI 設備的設備驅動。 /net 包含網絡驅動源碼,如tulip.c中的DECChip 21040 PCI以太網驅動。 /sound 所有的聲卡驅動源碼。 文件系統 EXT2文件系統的源碼位於fs/ext2中,其數據結構定義位於include/linux/ext2_fs.h, ext2_fs_i.h 以及ext2_fs_sb.h中。虛擬文件系統數據結構在include/linux/fs.h中 描敘且其代碼在fs/*中。buffercache 和update核心後台進程在fs/buffer.c中實現。 網絡 網絡代碼位於net目錄而大多數包含文件位於include/net中。BSD套接口代碼位於 net/socket.c中。IPV4的INET套接口代碼位於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/kerneld.h目錄中。同時必要時需查閱include/linux/elf.h中的 ELF文件格式。



Copyright © Linux教程網 All Rights Reserved