我不認為我是 linux 之上的高手,因為我的shell 沒有達到c語言的 拿來即用的水平,而且我的核心開發主要集中於裝置驅動的開發。但我確信我現在已經是乙個入門者,可以再遇到問題的時候,迅速定位,然後給出正確的指導和答案。
linux核心難嗎?
接觸之初,和現在完全是兩種答案。在學習linux之前,我做過幾年的微控制器開發,基本的51系列,msp430系列等等。這為我理解linux的對硬體的操作打下深刻基礎。因為對於cpu而言,最基本的部分是相同的,比如時鐘設定,看門狗,中斷,gpio,串列埠等等。這些在微控制器開發的時候,是完全要自己編寫驅動,使其適應不同要求的。所以,在轉移到linux之上時,我的學習的線索,就是以linux系統對硬體操作為主線的。比如,我要知道linux是怎麼操作cpu的時鐘的,我就要知道linux的api是通過什麼過程連線到最終的暫存器之上。
不斷的探索,記錄,理解,最終才對linux核心有了最初的了解。
在學習中,感覺與微控制器開發,最大不同在於,linux有了介面的概念。在以前的開發過程中,從來沒有把cpu的驅動控制器跟外圍裝置的驅動分開來操作,而在linux中有了bus的概念。bus的一端連著控制器,一端連著外圍驅動。bus的介面遮蔽了不同cpu之上裝置驅動器的不同,為外圍驅動開發提供了統一的介面。
在學習之初,我夢想著,自己可以寫乙個bus驅動,但當我仔細檢視核心原始碼時,發現linux核心幾乎涵蓋了所有的匯流排介面。而對應的cpu匯流排控制器的驅動,多數都由cpu開發者來提供。對於乙個初級的驅動開發者來說,可以熟練的使用匯流排介面,開發外圍裝置驅動就可以滿足要求了,不必理會bus另一端的具體實現。
但,我是學過硬體的,晶元採購,電路設計,pcb繪製都做過,所以我覺得自己應該了解的更深入一些。在裝置驅動開發之中,最重要的就是理解device,bus,driver的概念。如果理解了三者之間的關係,那麼裝置驅動就明白一半了。裝置驅動的其他部分就是核心中的基本概念,比如阻塞,同步,task,中斷,還有使用者層介面。
我想學習核心,除了從硬體上入手之外,還可以從使用者層介面入手。畢竟不是很多人都有硬體的基礎,所以如果對linux應用軟體熟悉的話,那麼最好的方法就是從使用者層介面入手了。比如裝置節點,proc 檔案,sys檔案,netlink,uevent,系統呼叫等等。當能夠熟練的運用不同的介面,來操作硬體裝置的時候,就是linux核心入門的時候。
既然已經入門了,這個時候,對當前所有的匯流排驅動都可以達到拿來即用的地步。下一步的目標是什麼呢?記憶體管理,dma管理,中斷管理,檔案系統管理,啟動過程。這一部分是走向linux精髓的必由之路。記憶體管理幫助我們了解不同記憶體分配api的優點和缺點,不同記憶體分配演算法的特點,還有linux中的實存和虛存的空間分布等等。dma管理,可以使我們了解dma的啟動過程,使用方法,這個部分也依賴於硬體。中斷管理,幫助我們了解中斷的組織和呼叫路由,以及中斷的使用方法和注意要素。檔案系統管理,可以讓我們深入理解linux的vfs層,所有的操作能看到的就是vfs的介面。啟動過程,我們可以知道 bootloader啟動linux核心的引數和引導,硬體的初始化順序,驅動的載入順序,rootfs的掛載等等。
到了這一步,我想對於linux核心的學習,可以達到60%左右了吧。最後一部分就是linux的核心排程和網路協議棧。這兩個部分是最重要的部分。任務排程是任何乙個作業系統的核心,通過任務排程可以得出乙個系統的優勢和特點。關於核心排程,我想首先需要明白乙個程序是如何建立並執行的。這個時候,就涉及到了linux系統的可執行程式的格式,比如elf。為什麼乙個程式,在shell中呼叫就可以執行了呢?先看看busybox中shell的**,看看系統呼叫的**,看看核心建立程序的過程等等。多個建立的程序在核心中是如何排程的呢?我只在大學的時候被告知了linux的幾種排程演算法,但親自看看**和實現過程將是另外的一種進步。如果你還看過其他系統的**,比如vxworks,可以比較一下兩個系統的排程上的差異,以及這種差異導致的應用領域的不同(當然不全是排程差異導致的)。
網路協議棧是複雜的工程。也是我的欠缺之處。沒有過多的涉及,我想知道socket是如何建立的,如何阻塞的,如果通訊的,棧中的演算法等等。或許網路協議棧不是工作中必須的,但是linux高手必須的。
我不推薦把線上的每個鈴鐺都瞭如指掌,那需要太多時間。我們要掌握的是那一張網。如果要在網上添乙個鈴鐺,你可以迅速定位到想要的位置就可以。甚至,我不知道該放在哪個位置,但我可以通過網上某個線索迅速的定位到那個位置,然後再學習連線方法都行。
linux核心就是一張網,其中的層次結構和介面,是引人入勝的地方。
如果網路上沒有你要的答案,那麼原始碼就是最佳解決方法。
一起加油吧!
GPIO核心之旅
linux核心中gpio 是最簡單 最常用的資源 和 interrupt dma,timer一樣 驅動程式,應用程式都能夠通過相應的介面使用gpio,gpio使用0 max int之間的整數標識,不能使用負數,gpio與 硬體體系密切相關的 不過linux 有乙個框架 處理gpio,能夠使用統一的介...
Android Framework核心之旅
android framework核心之旅 6.1 framework框架 framework定義了客戶端元件和服務端元件功能及介面。以下闡述中,應用程式 一般是指 apk 程式。框架中包含三個主要部分,分別為服務端 客戶端和linux驅動。6.1.1服務端 服務端主要包含兩個重要類,分別是wind...
初秋西安,終南山Linux核心問道之旅
初秋西安,最美終南山,一眾linux大咖齊聚西安郵電大學,問道linux,共話核心技術的產學研用。linux核心一路走來,從91年發布第乙個版本到現在26年來,核心的版本可能達到近千個,迭代速度非常快。面對外界日新月異的技術變化,隨著智慧型計算開始從雲端向嵌入式端遷移,linux 毫無爭議的成為從端...