歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> The Linux Kernel Sources(Linux核心源程序)

The Linux Kernel Sources(Linux核心源程序)

日期:2017/2/27 9:40:49   编辑:更多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://ftp.cs.helsinki.fi和其它所有的鏡像的web站點。Helsinki的web站點最新,但是其它站點例如MIT和Sunsite也不會太落後。   如果你無法訪問web,還有許多CDROM廠家用非常合理的費用提供世界主要web站點的塊找。一些甚至提供預訂服務,按季或月進行更新。你的本地的Linux用戶組也是一個源程序的好的來源。   Linux核心源程序有一個非常簡單的編號系統。任何偶數的核心(例如2.0.30)都是一個穩定的發行的核心,而任何奇數的核心(例如2.1.42)都是一個開發中的核心。本書基於穩定的2.0.30源代碼。開發版的核心具有所有的最新特點和所有最新的設備的支持,但是它們可能不穩定,可能不是你所要的,但是讓Linux社團測試最新核心是很重要的。這樣可以讓整個社團都進行測試。記住,即使你測試非生產用核心,最好也要備份你的系統。   對於核心源程序的改動作為patch文件分發。工具patch可以對於一系列源文件應用一系列修改。例如,如果你有2.0.29的源程序樹,而你希望轉移到2.0.30,你可以取到2.0.30的patch文件,並把這些patch(編輯)應用到源程序樹上:   $ cd /usr/src/linux $ patch -p1 < patch-2.0.30   這樣可以不用拷貝整個源程序樹,特別對於慢速的串行連接。一個核心補丁(正式和非正式的)的好來源是http://www.linuxhq.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目標文件的結構。




Copyright © Linux教程網 All Rights Reserved