簡體   English   中英

Linux內核引導方法預先構建的rootfs

[英]Linux Kernel Booting Approach Pre built rootfs

我正在學習linux內核啟動過程,並嘗試在beagleboard xM上安裝linux。 我遇到了兩種使用SD卡的方法。 1.將MLO,initrd,uboot.bin和uImage放在一個分區中。 2.在一個分區中具有MLO,uboot.bin和uImage,在第二分區中具有預構建的rootfs(Angstrom)。

在第一種方法中,如何將initrd轉換為第二個分區上的完整文件系統。 當uboot從uImage提取內核並將其粘貼到第二個分區時,內部會發生什么。 哪個目錄將修改init rootfs。 內核的初始化過程如何調用。

通常,Beagleboard-XM中的啟動順序是這樣的:

固件-> MLO-> uboot.bin-> uImage-> initrd(可選)-> rootfs

initrd本身是一個簡單的基於RAM的文件系統。 它通常用於掛載實際的文件系統。 掛載rootfs所需的一些模塊捆綁在initrd中。 掛載rootfs后,將清理initramfs。 如果掛載rootfs所需的功能內置於內核(uImage)本身,則不需要initrd。 如前所述,initrd是一個簡單的基於RAM的文件系統。 這意味着,如果您將此文件用作文件系統,則寫入該文件系統的任何內容都不會保留。 實際上,一些嵌入式應用程序將其用作其rootfs。

現在回答您的問題,

如何將initrd轉換為第二個分區上的完整文件系統?

最初,u-boot將內核(uImage)加載,將initrd加載到RAM並將適當的命令行參數傳遞給內核。 一旦u-boot將控制權轉移到內核,它將首先初始化驅動程序和其他模塊,最后尋找initrd。 通常將initrd作為cpio映像放置。 然后,內核將其解壓縮並查找“ init”。 初始化進程會處理一些事情,然后掛載rootfs。 關於initrd,沒有第二分區之類的東西。 它駐留在RAM中。

當uboot從uImage提取內核並將其粘貼到第二個分區時,內部會發生什么?

再次,關於uImage,沒有第二分區之類的東西。 uImage是u-boot可以理解的一種格式。 u-boot首先將uImage加載到RAM上,然后再將控件實際傳遞給內核,然后從uImage中提取內容,將二進制文件移至RAM中的預定義位置,然后將控件傳遞給內核。 與initrd類似,內核也駐留在RAM本身上。

哪個目錄會修改init rootfs?

沒有目錄被修改。 但是,是的,其中有一些已掛載,例如procfs,sysfs等。

內核的初始化過程如何調用?

請參閱init / main.c下的kernel_init()函數以查看內核如何執行init(請參見http://lxr.free-electrons.com/source/init/main.c#L871 )。

我附上了一個簡單的代碼片段:

if (!try_to_run_init_process("/sbin/init") ||
    !try_to_run_init_process("/etc/init") ||
    !try_to_run_init_process("/bin/init") ||
    !try_to_run_init_process("/bin/sh"))
    return 0;

panic("No working init found.  Try passing init= option to kernel. "
      "See Linux Documentation/init.txt for guidance.");

因此,內核在這些默認路徑中搜索init二進制文件。 如果找不到,則內核會崩潰!

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM