天天看點

第十四章 Linux核心資源

Table of Contents, Show Frames, No Frames

第十四章 Linux核心資源

本章主要描叙尋找某個特殊核心函數時用到的Linux核心資源。

本書并不要求讀者具有C程式設計語言的能力或者擁有Linux核心源代碼來了解Linux核心工作原理。但是如果 對核心源代碼進行閱讀将加深對Linux作業系統的了解。本章提供了一個核心源代碼的綜述。

從哪裡得到Linux核心源碼

所有主要Linux分發版本(如Craftworks,Debian,Slackware,Redhat)都包含了源碼在内。通常安裝在 你的Linux系統核心就是從這些源碼中構造出來的。由于一些顯然的因素,這些源碼都或多或少有點過期。 你可以在www-appendix一章中的那些WEB站點中得到最新的版本。這些站點包括ftp://ftp.cs.helsinki.fi 以及所有其他鏡象站點中。helsinki的這個WEB站點上的Linux源碼顯然是最新的但是MIT和Sunsite中的也 不會差太遠。

如果你無法通路這些WEB站點,有許多CD ROM廠商以非常合理的價格提供了這些WEB站點的鏡象CD光牒。有些 廠商還提供每季度甚至每個月更新的訂購服務。另外你所在的本地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

系統中所有的裝置驅動都位于此目錄中。它又進一步劃分成幾類裝置驅動,如block。

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/bios32.c中。

程序間通訊

所有這些代碼都在ipc目錄中。系統V IPC對象都包含一個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/*中。buffer cache 和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檔案格式。

File translated from TEX by TTH, version 1.0.

Top of Chapter, Table of Contents, Show Frames, No Frames

�1996-1999 David A Rusling copyright notice.

繼續閱讀