
我有一個在 FPGA 上實現的定制設計的 SoC,基於 ARM 處理器克隆,我嘗試在其上啟動 Linux(核心 3.10)。
我已經成功地添加了對我的自訂週邊(USART、中斷控制器和定時器)的支持,使我能夠看到核心在嘗試掛載根檔案系統之前顯示的 printk 訊息。
我有一個 2GB 定制非揮發性內存,隨機訪問,讀寫,從地址 0 映射到 0x7FFFFFFF,引導程序從中執行,並且包含內核和文件系統分區。引導程式將核心複製到RAM(256Mb,從0x80000000 到0x8FFFFFFF),然後將控制權傳遞給Linux,這會在以下位置失敗:「核心恐慌- 不同步:VFS:無法在未知區塊(0,0)上掛載root fs 」。
從我的調試和互聯網搜索來看,內核似乎無法識別我的非揮發性內存,因此無法掛載文件系統。
我如何告訴內核它應該從該記憶體啟動,以及哪些程式碼必須添加到核心中?例如,是否可以讓核心認為我的記憶體是Nand,並修改Nand驅動程式以正確存取它?
預先感謝您的所有幫助和建議。
答案1
我不確定您現在正在為“檔案系統分割區”做什麼。但是您可以將 initrd 放入看起來/作用類似於 RAM 的非揮發性儲存中,然後讓引導程式告訴 Linux 使用 initrd。
大多數 initrd 都會進行一些設置,然後嘗試在區塊裝置上重新掛載根檔案系統。在您的情況下,您的 initrd 將是您真正的根檔案系統,您需要在 initrd 中放置 shell 等實用程式。
當使用 U-Boot 在 ARM 上啟動時,基本上啟動命令將內核和 initrd 從儲存裝置載入到固定的 RAM 位置,然後 initrd 的位址作為命令列參數傳遞給內核,指定位址。
那麼,如果您確實需要一個可讀/可寫入的區塊設備,MTD 驅動程式可以佔用一部分 RAM(MTD 驅動程式中有一個「實體系統 RAM」選項make menuconfig
)並將其轉換為區塊設備。例如,它可用於將顯示卡 RAM 安裝為小型交換分區。 看到這個。
modprobe phram phram=0x00100000;256MiB
我認為如果你在記憶體位置 0x00100000 有一個 256MByte 檔案系統,那麼執行此操作的命令是。然後,modprobe mtdblock
然後使得/dev/mtdblock0
.然後你就可以做類似的事情mount /dev/mtdblock0
。因此,您需要在 initrd 中編寫一個小腳本來執行上述操作,fsck /dev/mtdblock0
然後啟動您的init
進程 1 或啟動您的進程 1 。
您甚至可以以某種方式在核心命令列上指定所有內容,但我不確定是否支援。為了靈活起見,您可能無論如何都想使用一個小的 initrd。