Linux內核開發_2_Initramf

目錄

 

什麼是Initramf?

1.1 Initramf起源

1.1.1 tmpfs

1.1.2 Initramf誕生原因

1.2 qemu命令重新說明


什麼是Initramf?


1.1 Initramf起源


1.1.1 tmpfs


在最初,Linus(Linux內核的作者)早期想要編寫一個能夠與chech(CPU緩存)的文件系統,Linus在rasmfs(ram(與內存交互的文件系統)上的chech(緩存功能)上做了封裝,使其能夠對主板上的L1和L2等不同級別的緩存進行交互,名字叫tmpfs,也被叫做臨時的根文件系統,因爲原本的交互一般使用的都是ramfs文件系統與內存交互,與磁盤會使用ext的文件系統與之交互,這一切都會通過一個叫VFS的Linux子系統來完成與這些文件系統的掛載並交互。

1.1.2 Initramf誕生原因


文件系統的編寫也是需要要規範的,必須滿足VFS的架構,後面我們在詳細討論這個。

但是如果我們想要定製Linux內核,比如一些發行版,開機都會有定製畫面,或者加載一些第三方的DLIB庫,這些工作在內核態是萬萬不能的,因爲內核態是不能去做除了初始化硬件,和初始化內核態所需的一些變量參數,同時內核也不能進行浮點數運算,原因很簡單,浮點數在內存中和其它整數的表示不一樣,且運算指令集也不同,使用的運算器件也不一樣,且如果用戶態此時在進行浮點數運算,那麼內核態就需要等待用戶態完成浮點數運算才能進行下一次的浮點數運算,在硬件上浮點數的計算是比較複雜的,這些我後面會在CPU底層原理方面詳細說一下。

同時內核只能做線程調度還有內存管理一些工作,其它的內核絕對不能參與,因爲這樣會大幅度降低內核效率,且內核是絕對不允許使用任何運行時還要去動態加載的第三方lib庫,太過於耗時。內核一定要精簡,效率高,你可以在Linux內核裏看到大量宏,或者內聯,以及彙編的代碼,這些代碼都是優化代碼,因爲內核掌管硬件,從事過單片機開發的都只能,單片機開發,絕對不能使用編譯器優化命令,這樣容易導致某些關鍵指令被優化導致某些電路開關無法打開。

如開GPIO1的電路,但是開完立馬關掉如下代碼:

GPIO1 = 1;

sleep(2);

GPIO = 0;

編譯器會認爲最終結果GPIO等0,會直接把上面代碼省略掉,直接賦予GPIO0

後來,一些發行版的內核開發人員們想了一個辦法,那就是在tmpfs上進行一個簡單的封裝,因爲tmpfs是內核初始化結束後,運行VFS子系統時,會去主動加載一個臨時根文件系統,也可以不加載,這裏根據內核配置與內核啓動參數,在這個上面去完成我們想要的工作,去加載我們要加載的第三方lib庫,或者輸出開機啓動畫面等等工作,這個就叫Initramf,就相當於是要加載的根文件系統的一個應用程序。它是建立在tmpfs上的,在執行完之後會去加載我們的根文件系統,如果沒有指定內核參數,則加載默認的。

1.2 qemu命令重新說明


這裏我們把上一篇文章的qemu啓動命令在重新說一遍:
 

qemu-system-x86_64   \
     -kernel ./bzImage 內核文件
     -initrd ./rootfs  臨時根文件系統
     -append "root=根文件系統 rdinit=第一個init程序"

-initrd 就是指定我們的臨時根文件系統目錄,同時臨時根文件系統的格式只能是SVR4的歸檔格式,詳細可以參考我上一篇的文章,指定了之後,-append給內核傳遞啓動參數時立馬的rdinit意思是從臨時根文件系統裏尋找第一個執行的程序,如果是init=則是從根文件系統裏尋找,這個需要使用root=指定根文件系統

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章