Linux Kernel 2:使用者空間的初始化
阿新 • • 發佈:2019-01-31
Run level說白了就是將系統執行狀態分成幾個級別,例如shutdown的時候init需要執行一些操作,reboot的時候需要執行一些操作。
這裡關於Init的東西就不介紹了,很多關於linux系統配置的知識都有涉及。(確實比android的init要複雜多了)
四 Initial RAM Disk
LK在早期初始化的過程中,需要mount一個FS,目前有新舊兩種方法:
ARM支援將前面的initrd和vmlinux打包到一個image中。實際上只有ARM架構支援。(核心編譯的時候要選擇這一項)。講了這麼多,那麼到底怎麼用呢?
KL如何使用這個initrd呢?
各位看官可以下載看看。
- old方法就是使用initial ram disk,也叫initrd
- new方法就是使用iniramfs
ARM支援將前面的initrd和vmlinux打包到一個image中。實際上只有ARM架構支援。(核心編譯的時候要選擇這一項)。講了這麼多,那麼到底怎麼用呢?
- initrd也是一個image。由bootloader啟動的時候,或者bootloader下載到某個地方
- bootloader把initrd的地址告訴核心。核心啟動時候把這個image解壓並掛載
- 另外一種辦法,編譯的時候將initrd和kernel放到一個image中,這種方法只有ARM架構支援。使用這種辦法話,建議用initramfs。注意,android中使用的就是一個kernel+initramfs的單一image。也就是第二種辦法
- KL先根據引數指定的initrd地址,將這個image拷貝到記憶體中,然後解壓,並掛載為/
- 找到這個disk中的linuxrc檔案,然後執行裡邊的語句《====這給了我們定製化自己ES的好計劃
-
處理完linuxrc後,KL unmount這個initrd,並載入真正的root device(看到沒,這個initrd就是做些初始化的工作,但是你也可以不umount這個initrd。)這裡的處理稍有差異。如果BL在引數中指明root=/dev/ram0,(程式碼中可見到這些語句),那麼KL就不會執行linuxrc,並且也不會umount initrd。也就是這個initrd就是最終的根檔案系統了。
- 搞一個資料夾吧,可仿照PC機器上linux的檔案結構。也可以把busybox放上去。
- find testramfs -depth -print | cpio -ov > testramfs.cpio cpio的輸入是檔名,輸出通過>定向到testramfs.cpio。大家可以試試。
- 解壓的話,cpio -ivd < testramfs.cpio。這樣就能還原testramfs資料夾中的內容了。
- UB的程式碼結構,先從CPU的start.S開始,這裡會根據不同的CPU進行初始化,大部分程式碼都不需要我們修改
- 再是Board的啟動,這個和具體的板子有關。現在改名叫lowlevel_init.S了。
各位看官可以下載看看。