現在我們已經了解了如何構建並使用定製的初始 ram 磁碟,本節將探索核心是如何識別 initrd 並將其作為根檔案系統進行掛載的。我們將介紹啟動鏈中的幾個主要函式,並解釋一下到底在進行什麼操作。
引導引導程式,例如 grub,定義了要載入的核心,並將這個核心映像以及相關的 initrd 拷貝到記憶體中。我們可以在 linux 核心源**目錄中的 ./init 子目錄中找到很多這種功能。
在核心和 initrd 映像被解壓並拷貝到記憶體中之後,核心就會被呼叫了。它會執行不同的初始化操作,最終您會發現自己到了init/main.c:init()
(subdir/file:function)函式中。這個函式執行了大量的子系統初始化操作。此處會執行乙個對init/do_mounts.c:prepare_namespace()
的呼叫,這個函式用來準備命名空間(掛載 dev 檔案系統、raid 或 md、裝置以及最後的 initrd)。載入 initrd 是通過呼叫init/do_mounts_initrd.c:initrd_load()
實現的。
initrd_load()
函式呼叫了init/do_mounts_rd.c:rd_load_image()
,它通過呼叫init/do_mounts_rd.c:identify_ramdisk_image()
來確定要載入哪個 ram 磁碟。這個函式會檢查映像檔案的 magic 號來確定它是 minux、etc2、romfs、cramfs 或 gzip 格式。在返回到initrd_load_image
之前,它還會呼叫init/do_mounts_rd:crd_load()
。這個函式負責為 ram 磁碟分配空間,並計算迴圈冗餘校驗碼(crc),然後對 ram 磁碟映像進行解壓,並將其載入到記憶體中。現在,我們在乙個適合掛載的塊裝置中就有了這個 initrd 映像。
現在使用乙個init/do_mounts.c:mount_root()
呼叫將這個塊裝置掛載到根檔案系統上。它會建立根裝置,並呼叫init/do_mounts.c:mount_block_root()
。在這裡呼叫init/do_mounts.c:do_mount_root()
,後者又會呼叫fs/namespace.c:sys_mount()
來真正掛載根檔案系統,然後chdir
到這個檔案系統中。這就是我們在清單 6 中所看到的熟悉訊息vfs: mounted root (ext2 file system).
的地方。
最後,返回到init
函式中,並呼叫init/main.c:run_init_process
。這會導致呼叫execve
來啟動 init 程序(在本例中是/linuxrc
)。linuxrc 可以是乙個可執行程式,也可以是乙個指令碼(條件是它有指令碼直譯器可用)。
這些函式的呼叫層次結構如清單 7 所示。儘管此處並沒有列出拷貝和掛載初始 ram 磁碟所涉及的所有函式,但是這足以為我們提供乙個整體流程的粗略框架。
清單 7. initrd 載入和掛載過程中所使用的主要函式的層次結構
init/main.c:initinit/do_mounts.c:prepare_namespace
init/do_mounts_initrd.c:initrd_load
init/do_mounts_rd.c:rd_load_image
init/do_mounts_rd.c:identify_ramdisk_image
init/do_mounts_rd.c:crd_load
lib/inflate.c:gunzip
init/do_mounts.c:mount_root
init/do_mounts.c:mount_block_root
init/do_mounts.c:do_mount_root
fs/namespace.c:sys_mount
init/main.c:run_init_process
execve
Linux 初始 RAM磁碟(initrd)概述
loop裝置 loop裝置是一種偽裝置,是使用檔案來模擬塊裝置的一種技術 檔案模擬成塊裝置後,就像乙個磁碟或光碟一樣使用。在使用之前,乙個 loop 裝置必須要和乙個檔案進行連線,這種結合方式給使用者提供了乙個替代塊特殊檔案的介面。因此,如果這個檔案包含有乙個完整的檔案系統,那麼這個檔案就可以像乙個...
提公升Xcode編譯效能,RAM磁碟編譯
deriveddata xcode會在檔案系統中集中的快取臨時資訊。每次對xcode ios專案進行clean build或者在ios虛擬機器上launch,xcode都會在derivedata資料夾中進行讀寫操作。換句話說,就是將derived data的讀寫從硬碟移動到記憶體中。deriveda...
提公升Xcode編譯效能,RAM磁碟編譯
deriveddata xcode會在檔案系統中集中的快取臨時資訊。每次對xcode ios專案進行clean build或者在ios虛擬機器上launch,xcode都會在derivedata資料夾中進行讀寫操作。換句話說,就是將derived data的讀寫從硬碟移動到記憶體中。deriveda...