Linux內(nèi)核源代碼概述_Linux教程
首先研究 Linux 源代碼樹的頂層目錄,它通常(但不總是)位于 /usr/src/linux-。我們不會(huì)研究得過(guò)于詳細(xì),因?yàn)?Linux 源代碼經(jīng)常會(huì)發(fā)生變化,但是,我們將嘗試讓給出的信息足以找出特定驅(qū)動(dòng)程序或函數(shù)的位置。
Makefile:這個(gè)文件是整個(gè)源代碼樹的頂層 makefile。它定義了很多實(shí)用的變量和規(guī)則,比如默認(rèn)的 gcc 編譯標(biāo)記。
Documentation/:這個(gè)目錄中包含很多關(guān)于配置內(nèi)核、運(yùn)行 ramdisk 等任務(wù)的實(shí)用信息(但通常是過(guò)時(shí)的)。不過(guò),與不同配置選項(xiàng)相應(yīng)的幫助條目并不在這里 —— 它們?cè)诿總(gè)源代碼目錄的 Kconfig 文件中。
arch/:所有與體系結(jié)構(gòu)相關(guān)的代碼都在這個(gè)目錄以及 include/asm- 目錄中。在此目錄中,每種體系結(jié)構(gòu)都有自己的目錄。例如,用于基于 PowerPC 的計(jì)算機(jī)的代碼位于 arch/ppc 目錄中。在這些目錄里,可以找到底層內(nèi)存管理、中斷處理、早期初始化、匯編例程,等等。
crypto/:這是內(nèi)核本身所用的加密 API。
drivers/:按照慣例,在此目錄的子目錄中可以找到運(yùn)行外圍設(shè)備的代碼。包括視頻驅(qū)動(dòng)程序、網(wǎng)卡驅(qū)動(dòng)程序、底層 SCSI 驅(qū)動(dòng)程序,以及其他類似的驅(qū)動(dòng)程序。例如,在 drivers/net 中可以找到大部分網(wǎng)卡驅(qū)動(dòng)程序。將一類驅(qū)動(dòng)程序組合在一起的某些更高層代碼,可能會(huì)(也可能不會(huì))像底層驅(qū)動(dòng)程序本身那些包含在同一目錄中。
fs/:通用文件系統(tǒng)的代碼(稱做 VFS,即 Virtual File System)和各個(gè)不同文件系統(tǒng)的代碼都可以在這個(gè)目錄中找到。ext2 文件系統(tǒng)是在 Linux 中最常廣泛使用的文件系統(tǒng)之一;在 fs/ext2 中可以找到讀取 ext2 格式的代碼。并不是所有文件系統(tǒng)都會(huì)編譯或運(yùn)行;對(duì)某些尋找內(nèi)核項(xiàng)目的人而言,更生僻的文件系統(tǒng)永遠(yuǎn)都是理想的候選者。
include/:在 .c 文件的開頭所包含的大部分頭文件都可以在這個(gè)目錄中找到。 asm- 目錄下是與體系結(jié)構(gòu)相關(guān)的包含(include )文件。部分內(nèi)核構(gòu)建過(guò)程創(chuàng)建從 asm 指定 asm- 的符號(hào)鏈接。這樣,無(wú)需將其固定編碼到 .c 文件 #include 就可以獲得用于那個(gè)體系結(jié)構(gòu)的正確文件。其他目錄中包含的是 非-體系結(jié)構(gòu)-相關(guān) 的頭文件。如果在不只一個(gè) .c 文件中使用了某個(gè)結(jié)構(gòu)體、常量或者變量,那么它可能應(yīng)該放入其中一個(gè)頭文件中。
init/:這個(gè)目錄中的文件包括 main.c、創(chuàng)建 早期用戶空間(early userspace) 的代碼,以及其他初始化代碼。可以認(rèn)為 main.c 是內(nèi)核“粘合劑(glue)”。在下一部分將深入討論 main.c。早期用戶空間提供了 Linux 內(nèi)核引導(dǎo)起來(lái)時(shí)所需要的功能,而這些功能并不需要在內(nèi)核本身運(yùn)行。
ipc/:IPC 的意思是 進(jìn)程間通信(interprocess communication)。它包含了共享內(nèi)存、信號(hào)量以及其他形式 IPC 的代碼。
kernel/:不適合放在任何其他位置的通用內(nèi)核級(jí)代碼位于此處。這里有高層系統(tǒng)調(diào)用代碼,以及 printk() 代碼、調(diào)度程序、信號(hào)處理代碼,等等。文件名包含很多信息,所以可以使用 ls kernel/,并非能常準(zhǔn)確地猜到每個(gè)文件的功能。
lib/:這里是對(duì)所有內(nèi)核代碼都通用的實(shí)用例程。常見的字符串操作、調(diào)試?yán)蹋约懊钚薪馕龃a都位于此處。
mm/:這個(gè)目錄中是高層次內(nèi)核管理代碼。聯(lián)合使用這些例程以及底層的與體系結(jié)構(gòu)相關(guān)的例程(通常位于 arch//mm/ 目錄中)來(lái)實(shí)現(xiàn)虛擬內(nèi)存(Virtual memory,VM)。在這里會(huì)完成早期內(nèi)存管理(在內(nèi)存子系統(tǒng)完全建立起來(lái)之前需要它),以及文件的內(nèi)存映射、頁(yè)高速緩存管理、內(nèi)存分配、RAM 中頁(yè)的清除(還有很多其他事情)。
net/:這里是高層網(wǎng)絡(luò)代碼。底層網(wǎng)絡(luò)驅(qū)動(dòng)程序與此層次代碼交換數(shù)據(jù)包,這個(gè)層次的代碼可以根據(jù)數(shù)據(jù)包將數(shù)據(jù)傳遞給用戶層應(yīng)用程序,或者丟棄數(shù)據(jù),或者在內(nèi)核中使用它。net/core 包含大部分不同的網(wǎng)絡(luò)協(xié)議都可以使用的代碼,和某些位于 net/ 目錄本身中的文件一樣。特定的網(wǎng)絡(luò)協(xié)議在 net/ 的子目錄下實(shí)現(xiàn)。例如,在 net/ipv4 目錄中可以找到 IP(版本 4)代碼。
scripts/:這個(gè)目錄中包含的腳本可用于內(nèi)核的構(gòu)建,但并不將任何代碼加入到內(nèi)核本身之中。例如,各種配置工具可以將它們的文件放在這里。
security/:在這里可以找到不同 Linux 安全模型的代碼,比如 NSA Security-Enhanced Linux 以及套接字和網(wǎng)絡(luò)安全鉤子函數(shù)(hooks),以及其他安全選項(xiàng)。
sound/:這里放置的是聲卡驅(qū)動(dòng)程序和其他與聲音相關(guān)的代碼。
usr/:此目錄中的代碼用于構(gòu)建包含 root 文件系統(tǒng)映像的 cpio-格式 的歸檔文件,用于早期用戶空間。
所有這些匯集在哪里
init/main.c 文件是整個(gè) Linux 內(nèi)核的中央聯(lián)結(jié)點(diǎn)。每種體系結(jié)構(gòu)都會(huì)執(zhí)行一些底層設(shè)置函數(shù),然后執(zhí)行名為 start_kernel 的函數(shù)(在 init/main.c 中可以找到這個(gè)函數(shù))。
代碼的執(zhí)行順序大致如下:
Architecture-specific set-up code (in arch//*)
|
v
The function start_kernel() (in init/main.c)
|
v
The function init() (in init/main.c)
|
v
The user level "init" program
關(guān)于執(zhí)行順序的更多細(xì)節(jié)
更詳細(xì)地講,發(fā)生的事情是:
執(zhí)行體系結(jié)構(gòu)相關(guān)的設(shè)置代碼:
如果需要,解壓縮并移動(dòng)內(nèi)核代碼本身
初始化硬件
這可能包括底層內(nèi)存管理的設(shè)置
將控制權(quán)轉(zhuǎn)交給函數(shù) start_kernel()
start_kernel() 去執(zhí)行以下事情(以及其他事情):
打印內(nèi)核版本和命令行
啟動(dòng)控制臺(tái)輸出
啟用中斷
校準(zhǔn)延遲循環(huán)
調(diào)用 rest_init(),這個(gè)函數(shù)會(huì):
啟動(dòng)一個(gè)內(nèi)核線程來(lái)運(yùn)行 init() 函數(shù)
進(jìn)入空閑循環(huán)
init():
啟動(dòng)其他處理器(在 SMP 機(jī)器上)
啟動(dòng)設(shè)備子系統(tǒng)
掛載 root 文件系統(tǒng)
釋放不使用的內(nèi)核內(nèi)存
運(yùn)行 /sbin/init(或者 /etc/init,或者...)
此時(shí),用戶級(jí) init 程序正在運(yùn)行;它將完成啟動(dòng)網(wǎng)絡(luò)設(shè)備并在控制臺(tái)上運(yùn)行 getty (登錄程序)等任務(wù)。
加入自己的 printk,并觀察那個(gè)子系統(tǒng)的 printk 相對(duì)于自己的 printk 何時(shí)出現(xiàn),就可以指出那個(gè)子系統(tǒng)是在 start_kernel() 中還是在 init() 中初始化的。例如,如果想要知道 ALSA 聲音系統(tǒng)何時(shí)被初始化,那么將 printk 加入到 start_kernel() 和 init() 的起始處,然后找到“Advanced Linux Sound Architecture [...]” 相對(duì)于您的 printk 在何處打印出來(lái)。
- Linux系統(tǒng)下TOP命令使用與分析詳解
- 安裝Linux我們需要改變20件事情
- 使用Linux系統(tǒng)架設(shè)VSFTP服務(wù)器
- Linux系統(tǒng)上架設(shè)POP3服務(wù)器
- Linux中“Networking Disabled”的解決方法(解決Ubuntu等系統(tǒng)無(wú)法上網(wǎng))
- ubuntu系統(tǒng)清理磁盤教程
- linux下搭建pxe自動(dòng)化安裝環(huán)境
- BIOS不支持導(dǎo)致Linux內(nèi)核耗電增加
- Debian GNU/Linux系統(tǒng)卡片
- Linux操作系統(tǒng)開機(jī)自行啟動(dòng)項(xiàng)目詳細(xì)解析
- Linux菜鳥入門級(jí)命令大全
- Linux操作系統(tǒng)中讀取目錄文件信息的過(guò)程
Linux教程Rss訂閱服務(wù)器教程搜索
Linux教程推薦
- Linux下設(shè)置匿名FTP簡(jiǎn)介
- 簡(jiǎn)述linux中Load average負(fù)載
- Debian GNU/Linux系統(tǒng)卡片
- 推薦5款Linux網(wǎng)絡(luò)監(jiān)控工具 超經(jīng)典的工具
- 為L(zhǎng)inux MySQL數(shù)據(jù)庫(kù)設(shè)置磁盤限額
- linux計(jì)劃任務(wù)-crond服務(wù)
- Linux下快速搭建Apache/Lighttpd+PHP+MySQL
- Linux的基于PAM的用戶認(rèn)證
- Linux系統(tǒng)下的C語(yǔ)言開發(fā)都需要學(xué)些什么
- 如何使用screen 命令
- 相關(guān)鏈接:
- 教程說(shuō)明:
Linux教程-Linux內(nèi)核源代碼概述
。