linux核心學習導讀

2021-06-26 16:28:44 字數 3481 閱讀 6661

引用出處:

像linux

核心這樣龐大而複雜的程式看起來確實讓人望而生畏,它象乙個很大的球,沒有起點和終點。在讀源**的過程中,你會遇到這樣的情況,當讀到核心的某一部分時又會涉及到其它更多的檔案,當返回到原來的地方想繼續往下讀時,又忘了原來讀的內容。在

internet

上,很多人為此付出了很大的努力,製作出了源**導航器,這為源**閱讀提供了良好的條件,

下面給出閱讀源**的一些線索。

1. 系統的啟動和初始化

在基於intel

的系統上,當

loadlin.exe 

或lilo

把核心裝入到記憶體並把控制權傳遞給核心時,核心開始啟動。關於這一部分,看

arch/i386/kernel/head.s 

,head.s

進行特定結構的設定,然後跳轉到

init/main.c

的main()

例程。

2. 記憶體管理

記憶體管理的**主要在

/mm,但特定結構的**在

arch/*/mm

。缺頁中斷處理的**在

mm/memory.c

,而記憶體對映和頁快取記憶體器的**在

mm/filemap.c

。緩衝器快取記憶體是在

mm/buffer.c 

中實現,而交換快取記憶體是在

mm/swap_state.c 

和mm/swapfile.c

中實現。

3. 核心

核心中,特定結構的**在

arch/*/kernel

,排程程式在

kernel/sched.c

,fork

的**在

kernel/fork.c

,task_struct 

資料結構在

include/linux/sched.h中。

4.pci

pci 

偽驅動程式在

drivers/pci/pci.c 

,其定義在

include/linux/pci.h

。每一種結構都有一些特定的

pci bios 

**,intel

的在arch/alpha/kernel/bios32.c。

5.程序間通訊 所有

system v ipc 

物件許可權都包含在

ipc_perm 

資料結構中,這可以在

include/linux/ipc.h

中找到。

system v 

訊息是在

ipc/msg.c

中實現, 

共享記憶體在

ipc/shm.c

中,訊號量在

ipc/sem.c

中,管道在

ipc/pipe.c

中實現。

6. 中斷處理

核心的中斷處理**是幾乎所有的微處理器所特有的。中斷處理**在

arch/i386/kernel/irq.c

中,其定義子在

include/asm-i386/irq.h中。

7. 裝置驅動程式

linux

核心源**的很多行是裝置驅動程式。

linux

裝置驅動程式的所有源**都儲存在

/driver

,根據型別可進一步劃分為:

/block

塊裝置驅動程式如

ide(

在ide.c)

。如果你想看包含檔案系統的所有裝置是如何被初始化的,你應當看

drivers/block/genhd.c

中的device_setup()

,device_setup()

不僅初始化了硬碟,當乙個網路安裝

nfs檔案系統時,它也初始化網路。塊裝置包含了基於

ide和

scsi

的裝置。

/char

這是看字元裝置(如

tty,串列埠及滑鼠等

)驅動程式的地方。

/cdrom

linux

的所有cdrom

**都在這兒,如在這兒可以找到

soundblaster cdrom

的驅動程式。注意

ide cd

的驅動程式是

ide-cd.c

,放在drivers/block

,scsi cd

的驅動程式是

scsi.c

,放在drivers/scsi。

/pci 這是

pci偽驅動程式的源**,在這裡可以看到

pci子系統是如何被對映和初始化的。

/scsi

在這裡可以找到所有的

scsi

**及linux

所支援的

scsi

裝置的所有裝置驅動程式。

/net

在這裡可以找到網路裝置驅動程式,如

decchip 21040 pci 

乙太網驅動程式在

tulip.c中。

/sound

這是所有音效卡驅動程式的所在地。

8. 檔案系統

ext2 

檔案系統的源**全部在

fs/ext2/ 

目錄下,而其資料結構的定義在

include/linux/ext2_fs.h, ext2_fs_i.h 

及ext2_fs_sb.h

中。虛擬檔案系統的資料結構在

include/linux/fs.h

中描述,而**是在

fs/*

中。緩衝區快取記憶體與更新核心的守護程序的實現是在

fs/buffer.c中。

8. 網路

網路**儲存在

/net

中,大部分的

include

檔案在include/net

下,bsd

套節口**

在net/socket.c

中,ip 第4

版本的套節口**在

net/ipv4/af_inet.c

。一般的協議支援**(包括

sk_buff 

處理例程)在

net/core

下,tcp/ip

聯網**在

net/ipv4

下,網路裝置驅動程式在

/drivers/net下。

9. 模組

核心模組的**部分在核心中,部分在模組包中,前者全部在

kernel/modules.c

中,而資料結構和核心守護程序

kerneld

的資訊分別在

include/linux/module.h

和include/linux/kerneld.h 

中。如果你想看

elf目標檔案的結構,它位於

include/linux/elf.h中。

Linux核心學習

交叉工具鏈 核心相關知識 linux系統的構成 使用者空間 核心空間 思考 為什麼劃分為兩個層次?目的其實是為保護作業系統,防止應用程式的異常導致作業系統崩潰。核心空間與使用者空間是程式執行的兩種不同狀態,通過系統呼叫和硬體中斷能夠完成從使用者空間到核心空間的轉移。那麼linux的核心由哪些構成呢?...

linux 核心學習

linux核心獲取 官網 linux作業系統的核心是模組化,可以使用lsmod命令檢視核心模組,下面展示已載入系統的模組 root 172.16.0.55 vendor composer test lsmod module size used by nfnetlink queue 8111 0 nf...

linux 核心學習(2)

linux核心原始碼樹大體結構 由於linux的原 持續在變化,所以不可能給出太詳細的內容,只能指出乙個特殊的驅動大概會出現在什麼地方。makefile 這是整個的原始碼樹的最頂層的makefile。它定義了很多的有用的變數和規則,如預設的gcc編譯標誌。arch 所有的特殊的體系結構的 都在這個目...