基礎 Linux 核心原始碼是怎麼組織的? 轉

2021-07-09 12:05:18 字數 4103 閱讀 4139

本文將重點將將linux核心**的組織方式。

目錄在談linux核心原始碼的組織方式之前,我們先談談linux核心**的版本是如何編號的。linux核心**的版本編號規則很簡單。任何偶數編號的核心(如2.0.30)都是穩定的發行版而奇數編號的核心(如2.1.42)都是正在開發的核心。開發版的核心具有所有最新的特徵並支援最新的裝置。儘管它們不是你所希望的那樣穩定,但是對於linux使用者團體來說試用新核心是非常重要的。因為他們將完成這些評測工作。當試用非發行版本核心時備份系統總是有好處的。

核心的修改以patch檔案來分發。而patch實用程式被用來對一些核心原始碼進行編輯。例如如果現在你已經有了2.0.39的核心**但是你想公升級到2.0.30,那麼你在取得2.0.30補丁檔案後可以實用以下命令來修改現存核心:

$ cd /usr/src/linux

$ patch -p1 < patch-2.0.30

乙個收集核心補丁的站點是

下面我們就談談linux核心原始碼的組織方式

核心原始碼的頂層是/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核心原始碼樹結構

如何閱讀linux核心**?

閱讀象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目錄中。系統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檔案格式。

linux核心原始碼

1.機器當前使用的核心版本 apuser jianzhangubtnb uname a linux jianzhangubtnb 3.2.0 23 generic 36 ubuntu smp tue apr 10 20 39 51 utc 2012 x86 64 x86 64 x86 64 gnu ...

核心原始碼解讀基礎

module init巨集的定義 第一段 typedef int initcall t void define define initcall level,fn,id static initcall t initcall fn id attribute used attribute section ...

原始碼基礎 核心類

分別列舉client nameserver broker三個部分的核心類,rocketmq的功能實現跟這些類密不可分。有時間的話,可以一一弄清楚每個類的具體作用。對於生產訊息來說,我們一般接觸的第乙個類就是它。defaultmqproducer producer new defaultmqprodu...