您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!
人總是對(duì)未知的事物充滿恐懼!就像航海一樣,在面對(duì)危難的時(shí)候,船員和船長(zhǎng)是一樣心中充滿恐懼的!只是船員始終充滿恐懼,而船長(zhǎng)卻能壓抑恐懼并從當(dāng)前找出突破口!
我沒有船長(zhǎng)之能,但也算入行兩年的老船員,我會(huì)追隨船長(zhǎng)一起尋找突破口!而內(nèi)核如此龐然大物不知從何入手這真的很正常,那么應(yīng)該的入口在哪里?其實(shí)我也不知道,一千個(gè)讀者就有一千個(gè)哈姆雷特。每個(gè)人都入口的理解都不一樣,有人說是必須有著良好的C編程經(jīng)驗(yàn),有人說必須有著對(duì)Linux發(fā)行版等必要的操作經(jīng)驗(yàn),也有的人說一定要數(shù)據(jù)結(jié)構(gòu)理解的很好,還有的人說你必須的對(duì)各種架構(gòu)的匯編了如指掌!眼花撩亂的知識(shí)你又掌握了多少呢?
1.必須有著良好的C語言理解能力,尤其是指針(靈魂嘛)
2.數(shù)據(jù)結(jié)構(gòu)確實(shí)的能看懂,尤其是鏈表
3.一定要有著非常濃厚的興趣,不成魔,不成活
第3點(diǎn)尤其最重要,因?yàn)榕d趣才是王道
假設(shè)你已經(jīng)對(duì)上述內(nèi)容有了一定的了解或者已經(jīng)是個(gè)老手了!想急需的去更深入的研究?jī)?nèi)核!
那么我們就開始吧!
頂層目錄
├── arch -- 體系架構(gòu)相關(guān)代碼,內(nèi)核支持市面上所有的主流架構(gòu)以及N多種CPU
├── block -- 塊設(shè)備子系統(tǒng)
├── crypto -- 加密解密庫函數(shù)
├── Documentation -- 說明文檔
├── drivers -- 設(shè)備驅(qū)動(dòng)
├── firmware -- 第三方設(shè)備固件
├── fs -- 文件系統(tǒng)子系統(tǒng)(VFS)
├── include -- 公共頭文件
├── init -- 啟動(dòng)初始化子系統(tǒng)(如掛載initrd)
├── ipc -- 進(jìn)程通信子系統(tǒng)
├── Kbuild -- 頂層鏈接文件
├── Kconfig -- 頂層配置配置
├── kernel -- 內(nèi)核核心代碼(基本與架構(gòu)無關(guān),包括調(diào)度子系統(tǒng))
├── lib -- 公共LIB庫函數(shù)
├── Makefile -- 頂層編譯文件
├── mm -- 內(nèi)存管理子系統(tǒng)
├── net -- 不包括網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)的網(wǎng)絡(luò)子系統(tǒng)
├── README -- 你懂得
├── samples -- Demo 代碼
├── scripts -- 編譯腳本以及工具
├── security -- 模塊安全相關(guān)(SELinux)
├── sound -- 音頻驅(qū)動(dòng)子系統(tǒng)
├── tools -- 內(nèi)核輔助工具
├── usr -- 用戶程序(目前只有一個(gè)用于initramfs的cpio打包程序)
└── virt -- 虛擬化相關(guān)
├── REPORTING-BUGS -- Bug 上報(bào)流程
├── MAINTAINERS -- 主要維護(hù)者(向社區(qū)致敬)
├── CREDITS -- 貢獻(xiàn)者(請(qǐng)牢記偉大的程序員)
內(nèi)核真是太龐大了,目前這個(gè)版本的代碼量已經(jīng)到了幾百萬行之多,那么問題來了,這么多的內(nèi)容我們應(yīng)該如何取舍?
Linux 核心功能分為五大子系統(tǒng)(進(jìn)程管理,內(nèi)存管理,虛擬文件系統(tǒng),網(wǎng)絡(luò)子系統(tǒng),進(jìn)程間通信)!
Ps.下面是網(wǎng)上找了一張圖片
Ps…對(duì)了,還忘了說一個(gè)非常非常重要的核心,那就是體系架構(gòu),因?yàn)槲耶?dāng)前是Mips,所以首先的熟悉MIPS架構(gòu)中的一些最基本的處理方式,并且內(nèi)核中有很多關(guān)于MIPS的匯編以及GUN混合MIPS的偽匯編,都需要去啃啊,瞬間好頭大!深吸一口氣,慢慢來吧!這部分內(nèi)容作為整體穿插的時(shí)候在進(jìn)行腦補(bǔ)吧?。。?!
好吧,下一節(jié)就要進(jìn)行實(shí)戰(zhàn)了,這里先腦補(bǔ)一下Makefile.
Makefile作為構(gòu)建內(nèi)核的引線,穿插在各個(gè)目錄中!那么對(duì)它的語法先簡(jiǎn)單的了解下!
基本的 make流程 其實(shí)是根據(jù)文件的時(shí)間戳來更新(讀取Makefile) 文件的編譯工作
從一個(gè)樣例來說明Makefile.
main:main.o name.o age.o
gcc main.o name.o age.o -o main
main.o:main.c
gcc -c main.c -o main.o
name.o:name.c
gcc -c name.c -o name.o
age.o:age.c
gcc -c age.c -o age.o
clean:
rm *.o main
基本格式為: 目標(biāo)生成文件名:源文件
生成過程(得到結(jié)果)
clean 作為方便的清除Makefike生成的編譯文件
看上述的主文件
main.c
#include <stdio.h>
extern void name();
extern void age();
int main()
{
name();
age();
return 0;
}
name.c
#include <stdio.h>
void name()
{
printf("My name is Xw. \n");
}
age.c
#include <stdio.h>
void age()
{
printf("My age is 22........\n");
}
雜種Shell + Makefile的演變
當(dāng)我們的可編譯文件越來越多時(shí)候,那么即時(shí)可能你少了一個(gè).o文件那也直接導(dǎo)致程序崩潰。
所以這個(gè)時(shí)候我們的雜種Shell(其實(shí)嚴(yán)謹(jǐn)?shù)恼f不是shell相似而已)就有用了。我們大可以用一個(gè)變量去代替你的源文件、也可以代替我們的編譯器。如下
CC=gcc //變量代替你的編譯器
OBJS=main.o name.o age.o //源文件
main:$(OBJS)
$(CC) $^ -o $@
main.o:main.c
$(CC) -c $^ -o $@
name.o:name.c
$(CC) -c $^ -o $@
age.o:age.c
$(CC) -c $^ -o $@
clean:
rm *.o main
表示所有不重復(fù)的依賴包名稱以空格隔開如上述main.omain.c分別可以做依賴包、因為依賴和被依賴僅僅是方向不一樣。其實(shí)是可以轉(zhuǎn)化的。當(dāng)然上述還可以寫成。表示所有不重復(fù)的依賴包名稱以空格隔開如上述main.omain.c分別可以做依賴包、因?yàn)橐蕾嚭捅灰蕾噧H僅是方向不一樣。其實(shí)是可以轉(zhuǎn)化的。當(dāng)然上述還可以寫成。(CC) -c OBJS−omain.oOBJS−omain.o<表示第一個(gè)依賴包名稱
Ps.上述僅僅是Makefile 最基本的使用,在內(nèi)核里完全是另外一回事,但是基本語法是一樣的!
*下一節(jié)我們就開始內(nèi)核的Makefile以及其它編譯規(guī)則的分析*
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08