欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Linux initrd的分析、創(chuàng )建和使用(轉)接上 - liux系統技術(shù) - 隨心--linux
Linux initrd的分析、創(chuàng )建和使用(轉)接上

使用初始 RAM 磁盤(pán)來(lái)引導系統

現在我們已經(jīng)了解了如何構建并使用定制的初始 RAM 磁盤(pán),本節將探索內核是如何識別 initrd 并將其作為根文件系統進(jìn)行掛載的。我們將介紹啟動(dòng)鏈中的幾個(gè)主要函數,并解釋一下到底在進(jìn)行什么操作。

引導加載程序,例如 GRUB,定義了要加載的內核,并將這個(gè)內核映像以及相關(guān)的 initrd 拷貝到內存中。我們可以在 Linux 內核源代碼目錄中的 ./init 子目錄中找到很多這種功能。

在內核和 initrd 映像被解壓并拷貝到內存中之后,內核就會(huì )被調用了。它會(huì )執行不同的初始化操作,最終您會(huì )發(fā)現自己到了 init/main.c:init()(subdir/file:function)函數中。這個(gè)函數執行了大量的子系統初始化操作。此處會(huì )執行一個(gè)對 init/do_mounts.c:prepare_namespace() 的調用,這個(gè)函數用來(lái)準備名稱(chēng)空間(掛載 dev 文件系統、RAID 或 md、設備以及最后的 initrd)。加載 initrd 是通過(guò)調用 init/do_mounts_initrd.c:initrd_load() 實(shí)現的。

initrd_load() 函數調用了 init/do_mounts_rd.c:rd_load_image(),它通過(guò)調用 init/do_mounts_rd.c:identify_ramdisk_image() 來(lái)確定要加載哪個(gè) RAM 磁盤(pán)。這個(gè)函數會(huì )檢查映像文件的 magic 號來(lái)確定它是 minux、etc2、romfs、cramfs 或 gzip 格式。在返回到 initrd_load_image 之前,它還會(huì )調用 init/do_mounts_rd:crd_load()。這個(gè)函數負責為 RAM 磁盤(pán)分配空間,并計算循環(huán)冗余校驗碼(CRC),然后對 RAM 磁盤(pán)映像進(jìn)行解壓,并將其加載到內存中?,F在,我們在一個(gè)適合掛載的塊設備中就有了這個(gè) initrd 映像。

現在使用一個(gè) init/do_mounts.c:mount_root() 調用將這個(gè)塊設備掛載到根文件系統上。它會(huì )創(chuàng )建根設備,并調用 init/do_mounts.c:mount_block_root()。在這里調用 init/do_mounts.c:do_mount_root(),后者又會(huì )調用 fs/namespace.c:sys_mount() 來(lái)真正掛載根文件系統,然后 chdir 到這個(gè)文件系統中。這就是我們在清單 6 中所看到的熟悉消息 VFS: Mounted root (ext2 file system). 的地方。

最后,返回到 init 函數中,并調用 init/main.c:run_init_process。這會(huì )導致調用 execve 來(lái)啟動(dòng) init 進(jìn)程(在本例中是 /linuxrc)。linuxrc 可以是一個(gè)可執行程序,也可以是一個(gè)腳本(條件是它有腳本解釋器可用)。

這些函數的調用層次結構如清單 7 所示。盡管此處并沒(méi)有列出拷貝和掛載初始 RAM 磁盤(pán)所涉及的所有函數,但是這足以為我們提供一個(gè)整體流程的粗略框架。


清單 7. initrd 加載和掛載過(guò)程中所使用的主要函數的層次結構
init/main.c:init                        init/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

無(wú)盤(pán)引導

與嵌入式引導的情況類(lèi)似,本地磁盤(pán)(軟盤(pán)或 CD-ROM)對于引導內核和 ramdisk 根文件系統來(lái)說(shuō)都不是必需的。DHCP(Dynamic Host Configuration Protocol)可以用來(lái)確定網(wǎng)絡(luò )參數,例如 IP 地址和子網(wǎng)掩碼。TFTP(Trivial File Transfer Protocol)可以用來(lái)將內核映像和初始 ramdisk 映像傳輸到本地設備上。傳輸完成之后,就可以引導 Linux 內核并掛載 initrd 了,這與本地映像引導的過(guò)程類(lèi)似。

壓縮 initrd

在構建嵌入式系統時(shí),我們可能希望將 initrd 映像文件做得盡可能小,這其中有一些技巧需要考慮。首先是使用 BusyBox(本文中已經(jīng)展示過(guò)了)。BusyBox 可以將數 MB 的工具壓縮成幾百 KB。

在這個(gè)例子中,BusyBox 映像是靜態(tài)鏈接的,因此它不需要其他庫。然而,如果我們需要標準的 C 庫(我們自己定制的二進(jìn)制可能需要這個(gè)庫),除了巨大的 glibc 之外,我們還有其他選擇。第一個(gè)較小的庫是 uClibc,這是為對空間要求非常嚴格的系統準備的一個(gè)標準 C 庫。另外一個(gè)適合空間緊張的環(huán)境的庫是 dietlib。要記住我們需要使用這些庫來(lái)重新編譯想在嵌入式系統中重新編譯的二進(jìn)制文件,因此這需要額外再做一些工作(但是這是非常值得的)。

結束語(yǔ)

初始 RAM 磁盤(pán)最初是設計用來(lái)通過(guò)一個(gè)臨時(shí)根文件系統來(lái)作為內核到最終的根文件系統之間的橋梁。initrd 對于在嵌入式系統中加載到 RAM 磁盤(pán)里的非持久性根文件系統來(lái)說(shuō)也非常有用。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linux 引導過(guò)程內幕
Linux 2.6 內核引導過(guò)程分析
深入理解linux啟動(dòng)過(guò)程
圖解linux啟動(dòng)過(guò)程
Linux 初始 RAM 磁盤(pán)(initrd)概述
Linux啟動(dòng)過(guò)程中文件系統的加載
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久