首先闡述一下我為什么想學習一下Linux kernel。最早是因為對嵌入式的一時腦熱,我買了開發(fā)板,買了不少資料,前前后后投進去了1000多了。不過好歹還是有點回報的,雖然還沒有怎么著調(diào),但又似乎拓寬了不小的知識面。
慢慢的我發(fā)現(xiàn),對于從學軟件入手的我來說,硬件知識的薄弱是個不容忽視的缺陷,畢竟軟硬件間的代溝還是不小的,就像現(xiàn)在的老爹和fashion閨女一樣,鴻溝還是忽視不得的。這有點讓我望而卻步,不過多大的困難都無法阻擋我的前進啊。我對策略稍作調(diào)整,因為我發(fā)現(xiàn),嵌入式無論是現(xiàn)在,還是未來一段時間都還是Linux的天下;另外是真正的做Linux的大牛們似乎也都有涉足embedded system 的經(jīng)歷。這就使得僅僅會管理Linux系統(tǒng)和服務,簡單的用幾個Shell commands ,編譯安裝幾個Linux應用,讀懂幾個Makefile……根本滿足不了需求;另外也為了不讓學習的OS知識只是空洞的理論。這都要求著自己必須有編寫自己Shell程序的能力;要求著可以在Linux做程序開發(fā)的能力;要求著可以自己往kernel中附加自定義的系統(tǒng)調(diào)用、重組內(nèi)核、添加自寫驅動……的能力。這就要求著必須深入了解,正如任何一門技術一樣,接觸久了你就有種相地層實現(xiàn)挖掘的沖動。
調(diào)整后的策略就是先把Linux這個OS的機制弄明白,才可以遷移定制滿足需求的系統(tǒng),才可以寫出高效率的Linux應用。整體路線就是農(nóng)村包圍城市,不斷補充必要知識,循序漸進,最終呈現(xiàn)星星之火可以燎原之勢。額,扯得夠遠。廢話不多說,下面開始。
Kernel入門,要選本好的入門書籍,我從網(wǎng)上download一本《Linux內(nèi)核設計與實現(xiàn)》。這本書簡單易讀,有OS基礎和Linux應用基礎的人一讀即懂,我現(xiàn)已閱過3章,感覺很不錯,另外配合《Linux操作系統(tǒng)內(nèi)核實習》效果更佳。我想盡可能通過更加通俗的形式向你闡述kernel的機理,讓我們一起如喝涼水般拿下kernel。
首先介紹一下內(nèi)核源碼的根目錄描述:
arch(architecture) 特定體系結構的源碼
crypto crypto API
Documention 內(nèi)核源碼文檔
drivers 設備驅動程序
fs VFS和各種文件系統(tǒng)
include 內(nèi)核頭文件
init 內(nèi)核引導和初始化
ipc 進程間通訊代碼
kernel 像調(diào)度程序這樣的核心子系統(tǒng)
lib 通用內(nèi)核函數(shù)
mm 內(nèi)存管理子系統(tǒng)和VM
net 網(wǎng)絡子系統(tǒng)
scripts 編譯內(nèi)核所用到的腳本
security Linux安全模塊
sound 語音子系統(tǒng)
usr 早期用戶空間代碼(所謂的initramfs)
這里只是簡單闡述個目錄及系統(tǒng)模塊分布。隨著慢慢地學習我相信一定可以把它們搞明白是怎么一回事的。
另外,你需要明白一些Linux必備的一些常識性名詞解釋知識,這里羅列一些名詞,不明白的不再一一闡述,自己百度,Google:管態(tài)、目態(tài)、內(nèi)核空間、用戶空間、POSIX、system V、GNU、GPL、GNOME、KDE、QT、GTK+、openGL、shell、awk、Makefile、CC、GCC、G++、GDB、Perl……
下面來介紹一下內(nèi)核開發(fā)和應用程序開發(fā)的差別:
內(nèi)核編程時不能訪問C庫(因為Linux下很多C庫函數(shù)是對Linux系統(tǒng)調(diào)用的封裝,自身怎么可以調(diào)用自身呢?)
內(nèi)核編程時必須使用GNU C。
內(nèi)核編程時缺乏像用戶空間那樣的內(nèi)存保護機制。
內(nèi)核編程時浮點數(shù)很難使用。
內(nèi)核只有一個很小的定長堆棧。
由于內(nèi)核支持異步中斷、搶占和SMP,因此必須時刻注意同步和并發(fā)。
要考慮可移植性的重要性。
對以上這幾點進行描述。
1、首先就是內(nèi)核不能訪問C庫的問題,你想啊Linux下很多C庫函數(shù)是對Linux系統(tǒng)調(diào)用的封裝,自身怎么可以調(diào)用自身呢?這里的系統(tǒng)調(diào)用學過OS的應該都清楚,是系統(tǒng)應用給用戶提供的編程接口,注意這里的對象是用戶。注意啦,程序員也是分等級的,在kernel級別的編程(這里指純kernel編程),你已經(jīng)看不到系統(tǒng)調(diào)用,此時你的職責可能就是為系統(tǒng)添加一個系統(tǒng)調(diào)用(后邊會講到),且C庫是應用層對底層系調(diào)(系統(tǒng)調(diào)用,為了便于我打字,后邊可能會多次出現(xiàn))的封裝,從邏輯的角度你也該明白了吧。那么問題就出來了,沒有c庫怎么辦,還談什么模塊化,難不成都自己寫?這就是接下來的問題。
2、既然kernel不能調(diào)用C庫,那么它就得擁有自己獨立的c語言庫,這樣才能高內(nèi)聚低耦合,并且提升其安全性,所以就用了GNU C 。短小精悍效率高,畢竟是專才專用。這里需要注意一點,內(nèi)核中沒有實現(xiàn)printf();但是有功能更為強大的printk();其實也談不上功能強大(因為printf()本身就很強大,尤其是在調(diào)試時,這里也顯出了printk的優(yōu)勢),它和printf()的顯著區(qū)別就是printk()允許通過指定一個標志來設置優(yōu)先級。Syslog會根據(jù)這個優(yōu)先級標志來決定什么地方顯示這條系統(tǒng)消息。如:
printk( KERN_ERR “This is an error!”); //不理解吧,我也不理解,后邊內(nèi)核調(diào)試時肯定還會將這東西,不怕。
3、內(nèi)核編程時缺乏像用戶空間那樣的內(nèi)存保護機制。
你在做什么?內(nèi)核好不好,這是一個OS的核心部分,控制著整個系統(tǒng)的運轉,自然要有處理協(xié)調(diào)整個系統(tǒng)的權利,在內(nèi)核coding的東西就是OS核心的一部分,是給別人或者自己在OS的上一層用的。既然你是把握這一切的,且又是在硬件基礎上的第一層抽象,另外還把握著全局,內(nèi)存的控制自然也不能束縛你,就像在公司工作一樣,領導要在可能的范圍內(nèi)盡可能的下放權力,下屬才能發(fā)揮他的極致,估計kernel也是這樣,內(nèi)存訪問,包括其他的內(nèi)核結構都不對出于內(nèi)核的你進行束縛,當然也沒有進行相應的保護機制。因為這是的內(nèi)核是你的,你沒必要***到寫程序讓自己的系統(tǒng)崩潰吧,哈哈。這也留了一個問題,就是在coding過程中要斟酌好啊。
4、內(nèi)核編程時浮點數(shù)很難使用。這里你需要知道的是在用戶空間的進程進行浮點操作時,kernel會完成從整數(shù)到浮點數(shù)的模式轉換,一般是通過捕獲陷阱并作相應的處理的實現(xiàn)的。//陷阱可以算是一種特殊的異常,是從用戶態(tài)進入內(nèi)核態(tài)的途徑,以后會進一步介紹。
與用戶空間不同的是,kernel并不能完美的支持浮點操作,因為自身不能陷入自身。在kernel中使用浮點數(shù)時,除了要人工保存和恢復浮點寄存器,還有很多瑣碎的事要做。直截了的說就是:不要在kernel中使用浮點數(shù)!!!
5、內(nèi)核只有一個很小的定長堆棧。在x86上,kernel的棧是在編譯時配置的,可為4k或者8k,且每個處理器都有自己的棧。為什么這么小呢?大了不可以么?我的理解是,現(xiàn)在都在追求微內(nèi)核,這是一方面原因,還有就是內(nèi)核也是一個軟件,只不過是包含了硬件抽象且富含大量系統(tǒng)管理功能的進程,而其他功能的進程(系統(tǒng)調(diào)用,其他內(nèi)核進程),在調(diào)度是,存在內(nèi)核搶占和代替內(nèi)核執(zhí)行的情況,這是要將要執(zhí)行的進程的上下文切換過來,當然這些數(shù)據(jù)都會出現(xiàn)在棧里邊,你想如果棧很大,那么操作時內(nèi)存訪問地址會很長,訪問時占內(nèi)存且費時間,會降低效率,所以要盡可能的小且靈活……
6、由于內(nèi)核支持異步中斷、搶占和SMP,因此必須時刻注意同步和并發(fā)。這不僅僅是linux kernel ,是所有現(xiàn)有的多進程/多線程并發(fā)OS都要注意的,包括多線程編程也一樣,你就把kernel想成是一個多線程的執(zhí)行程序就OK了,不難理解。
7、要考慮可移植性的重要性。這個更不用多說了,因為這是linux的一個灰常顯著的特征,大到企業(yè)的服務器,小到嵌入式的android,IP camera……等很多東西不同平臺構架的cpu……應該是目前跑的平臺最多的OS了,所以他的內(nèi)核要有足夠的可移植性,似乎有點java的感覺......
-
嵌入式
+關注
關注
5092文章
19177瀏覽量
307665 -
內(nèi)核
+關注
關注
3文章
1382瀏覽量
40422 -
Linux
+關注
關注
87文章
11345瀏覽量
210391 -
Kernel
+關注
關注
0文章
48瀏覽量
11235
原文標題:嵌入式未來一段時間還是Linux天下,一位嵌入式er初探Linux kernel經(jīng)驗
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
嵌入式資料 Kernel__LINUX內(nèi)核設計與實現(xiàn)(第二版)
嵌入式開發(fā)板的學習方法
如何通過網(wǎng)絡升級嵌入式系統(tǒng)的linux內(nèi)核
嵌入式Linux內(nèi)核實時性研究及改進
嵌入式linux學習誤區(qū)
嵌入式Linux系統(tǒng)和驅動開發(fā)
嵌入式linux內(nèi)核的編譯步驟
![<b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>的編譯步驟](https://file.elecfans.com/web1/M00/BF/62/pIYBAF7sFE-AXflOAABMvvyUnx8717.jpg)
嵌入式Linux內(nèi)核驅動開發(fā)學習路線圖
![<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>驅動開發(fā)<b class='flag-5'>學習</b>路線圖](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試
![<b class='flag-5'>嵌入式</b><b class='flag-5'>LINUX</b>系統(tǒng)<b class='flag-5'>內(nèi)核</b>和<b class='flag-5'>內(nèi)核</b>模塊調(diào)試](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【嵌入式】構建嵌入式Linux系統(tǒng)(uboot、內(nèi)核、文件系統(tǒng))
![【<b class='flag-5'>嵌入式</b>】構建<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>系統(tǒng)(uboot、<b class='flag-5'>內(nèi)核</b>、文件系統(tǒng))](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
嵌入式Linux的內(nèi)核編譯
![<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>的<b class='flag-5'>內(nèi)核</b>編譯](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
學習嵌入式的開發(fā)線路,新手怎么學習嵌入式?
![<b class='flag-5'>學習</b><b class='flag-5'>嵌入式</b>的開發(fā)線路,新手怎么<b class='flag-5'>學習</b><b class='flag-5'>嵌入式</b>?](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論