為嵌入式 Linux 平台建構核心映像
我有興趣為基於 Ingenic SoC 的平台編譯 linux 映像。供應商含糊地提供了有關如何為目標 SoC 編譯 linux 核心的說明。因此,根據供應商說明和線上搜尋,需要以下內容才能獲得該平台的嵌入式 linux 映像。
- 編譯工具鏈(mipsel for mips based architecture)
- 使用工具鏈使用給定的驅動程序/BSP 編譯 linux 核心
- 編譯根文件系統 - Busybox 建議(不知道為什麼)
- 為目標 SoC 編譯 uBoot
- 使用目標特定的分區表對 sd 等儲存進行分區
- 將整個圖像刷入sd
所以問題是,為什麼根文件系統與核心映像是分開的?busybox 在生成文件系統中起什麼作用?另外,如果 linux 映像是在沒有根文件系統的情況下編譯的,如何將兩者合併以在根文件系統的 /sys 目錄中擁有驅動程序?
建構嵌入式 linux 是一個非常廣泛但非常神秘的話題,不確定它是否適合 EE.SE 或 Unix/Linux.SE 站點。
可以在這裡找到一些解決您問題的書籍:
Linux From Scratch (LFS)
http://www.linuxfromscratch.org/
“源自流行的 Linux-From-Scratch-HOWTO,本書描述了從已經安裝的 Linux 發行版從頭開始創建自己的 Linux 系統的過程,使用只不過是所需的軟體來源。”
本書是 Linux 文件項目的一部分:
https ://www.tldp.org/guides.html
從您之前的問題(在 EE.SE 上)我可以看出您正在自學嵌入式系統,因此建議閱讀。Scratch 的 Linux 假設您在 PC 上為同一台 PC 建構 Linux 發行版;這與交叉編譯以針對 PC 以外的不同系統的問題是分開的。
其他推薦閱讀(也在上面的 TLDP 指南連結上):
- Bash 初學者指南
- Linux 簡介 - 動手指南
- GNU/Linux 命令行工具總結
- 高級 Bash 腳本指南
- Linux 系統管理員指南
- Linux 核心模組程式指南(如果你開始編寫設備驅動程序)
- 自定義 Linux:移植指南 - 將 LinuxPPC 移植到自定義 SBC
還可以查看嵌入式 Linux Wiki,https://elinux.org/Main_Page
您可能會考慮從更普遍支持的嵌入式目標系統開始,例如 Raspberry Pi 或 Beaglebone,其中有很多現有的支持。如果您首先在您的 PC 上建構一個相當新的發行版,然後建構相當新的發行版以在嵌入式目標系統上執行,那麼項目成功的機會就會大得多。這本質上是相同的問題,但是更多的人可以幫助解決有關建構 Raspian(Debian Stretch)的具體問題,很少有人會嘗試專門猜測 Ingeninc SoC。例如,請參閱 RaspberryPi.SE 上的這個問題:https ://raspberrypi.stackexchange.com/questions/3196/building-kernel-image-img-including-ramdisk
為什麼根文件系統與核心映像分開?
Linux就是這樣設計的。核心映像是在核心空間中執行的可執行程式碼(在啟動時,並具有特殊權限),根文件系統是它的數據。將兩者結合起來是沒有意義的,除非為特定目標系統建構引導媒體。
busybox 在生成文件系統中起什麼作用?
沒有任何。Busybox 將幾個最常用的 Unix 實用程序合併到 shell 執行檔中。
傳統的 Unix 偏愛許多小的、獨立的實用程序;相比之下,Busybox 方法將幾個最常用的實用程序捆綁為 shell 內置程序。Busybox 是包含在目標系統的根文件系統中的一個不錯的選擇,因為它在一個相當小且方便的包中提供了許多有用的實用程序。
“Linux from Scratch”指南遵循傳統的非 Busybox 方法。我建議首先完成該過程,而不必擔心是否為您的目標系統包含 Busybox。
如果 linux 映像是在沒有根文件系統的情況下編譯的,如何將兩者合併以在根文件系統的 /sys 目錄中擁有驅動程序?
設備驅動程序或者作為核心映像的一部分建構,或者它們是單獨的可載入核心模組,在引導過程中可選載入。
雖然術語“文件”通常表示儲存在非易失性儲存設備(如硬碟或 USB 記憶棒)上的比特流,但“文件”也可以表示具有名稱或某種其他類型的任何臨時數據位串處理。/proc、/sys 和 /dev 中有一些特殊的、動態生成的文件,它們由核心生成,並安裝在根文件系統的空 /proc /sys 和 /dev 佔位符之上。