天天看點

和菜鳥一起學linux核心源碼之基礎準備篇

 注:以下大部分内容摘自linux核心程式設計入門篇和linux核心完全注釋

       在工作的這段時間,發現我的visio畫圖熟悉了點點,總喜歡把什麼源碼啊,結構啊之類的就當作流程圖來畫來了解,因為對于圖,有一個很直覺的認識,是以接下去也是以圖為中心。

關于linux核心體系結構

       說到作業系統,我們都會知道windows作業系統,linux作業系統,蘋果的ios作業系統,以前很火的塞班作業系統,還有最近消費類電子很火的android作業系統。一個完整的作業系統分為4個部分。

和菜鳥一起學linux核心源碼之基礎準備篇

       可以把這個了解為我們用的手機。其中的硬體系統就是我們看到的整個手機了,cpu啊,記憶體啊,這些不拆開來看不到的,和觸摸屏啊,按鍵之類看以看到的。作業系統核心就是我們說的android了,不過他包括了linux的核心了。作業系統服務就是android的一套結構了,給我們直覺的就是那個有點炫的界面了。我們可以通過點選來實作我們想要的功能。使用者應用就是我們常玩的QQ啊,導航啊,當然少不了各種好玩的遊戲了,憤怒的小鳥,塗鴉跳,水果忍者,是不是又想玩一把?唉,還是好好學習吧,雖然手機就在旁邊。

對于linux核心的單核心模式的系統,有可以把他分為如下:

和菜鳥一起學linux核心源碼之基礎準備篇

       Linux核心又可分為5個大的子產品。

其關系和主要功能可以見下圖:

和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇

關于linux記憶體

實體記憶體可以分為下圖所示:

核心占用記憶體開始部分;接下來是共硬碟,軟碟使用的高速緩沖區部分,其中扣除顯存和bios的640k到1m;然後是虛拟盤;最後一部分是為所有程式可以使用的主記憶體區。

和菜鳥一起學linux核心源碼之基礎準備篇

Linux記憶體管理中,段變換:将一個由段選擇符和段内偏移構成的邏輯位址轉換為一個線性位址。頁變換:将線性位址轉換為對應的實體位址。具體可見下圖所示:

和菜鳥一起學linux核心源碼之基礎準備篇

虛拟位址:指的是由程式産生的由段選擇符和段内偏移位址兩個部分組成的位址。為什麼叫它是虛拟的位址呢?因為這兩部分組成的位址并沒有直接通路實體記憶體,而是要通過分段位址的變換機構處理或映射後才會對應到相應的實體記憶體位址。

       段描述符:向CPU提供了将邏輯位址映射為線性位址所必要的資訊。描述符是由程式編譯器、連結器、加載器或者作業系統建立的。

       描述符表:儲存描述符在描述符表中的,有兩類

1、 全局描述符表(Global descriptor table---GDT)

2、 局部描述符表(Local descriptor table---LDT)

描述符表是由8位元組構成的描述符項的記憶體中的一個數組。處理器是通過使用GDT和LDTR寄存器來定位GDT表和目前的LDT表。最多可以含有8192(2^13)個描述符。

選擇符:邏輯位址的選擇部分,用于指定一描述符的,它是通過指定一描述符表并且索引其中的一個描述符項完成的。

段寄存器:處理器将描述符中的資訊儲存在段寄存器中,因而可以避免在每次通路記憶體時查詢描述符表。

和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇

線性位址:通過指定一個頁表、頁表中的某一頁以及頁中的偏移值,進而間接地指向對應的實體位址。

頁表:一個簡單的32位頁訓示器的數組。頁表本身也是一頁記憶體,是以它含有4K位元組的記憶體,可容納1K個32位的項。

和菜鳥一起學linux核心源碼之基礎準備篇

Offset = 2^12=4K, table =2^10, directory = 2^10,是以線性位址空間為2^10*2^10*4k=4G。

由于0.11核心把每個程序的最大可用的虛拟記憶體空間定義為64M,是以每個程序的邏輯位址可以用任務号*64M,就可以轉換到線性空間的位址。

和菜鳥一起學linux核心源碼之基礎準備篇

關于linux程序

       程序可以在核心态或者使用者态運作,當資源可用就被喚醒,進入就緒态;當程序處于可中斷睡眠狀态,收到信号可被喚醒;當處于不可中斷睡眠狀态,隻能被使用wakeup等的喚醒;當程序處于暫停狀态,可發送信号使其進入就緒态;當僵死狀态,當已經停止運作,父程序還沒有調用wait查詢狀态,一旦父程序調用完wait取得子程序資訊後,這個程序任務資料結構就會被釋放掉。

和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇

關于linux檔案系統和源碼目錄

和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇
和菜鳥一起學linux核心源碼之基礎準備篇

關于linux核心makefile

Linux makefile檔案是編譯輔助工具軟體make的參數配置檔案。Make工具軟體的主要用途是通過識别哪些檔案已經被修改過,進而自動地決定在一個含有多個源程式檔案的程式系統中哪些檔案需要被重新編譯。

和菜鳥一起學linux核心源碼之基礎準備篇

       這裡的makefile主要作用是訓示make程式最終使用獨立編譯連接配接成的tools/目錄中的build執行程式将所有核心編譯代碼連接配接和合并成一個可運作的核心映像檔案image。具體是對boot/目錄中的bootsect.s、setup.s使用8086彙編器進行編譯,分别生成各自的執行子產品。再對源代碼中的其他所有程式使用GNU的編譯器gcc/gas進行編譯,并連接配接成子產品system。再用build工具将這三塊組合成一個核心映像檔案image。

繼續閱讀