在ARM中使用Ramdisk

2021-08-26 04:36:21 字數 1302 閱讀 6682

linux啟動時,initrd可以在記憶體中,也可以在 flash或其它可用的裝置上;

initrd檔案格式為: romfs/minix/ext2/gzip;相關的函式:drivers/block/rd.c: identify_ramdisk_image ;

載入位置: init/main.c: prepare_namespace;

需要的引數為:initrd_start 和 initrd_end;

arm如何傳遞initrd引數:arm傳遞initrd引數可以分為兩種情況:

1.從外部獲取的情況:

arch/arm/kernel/setup.c: 從 tag引數中獲取(tags簡單來說記憶體中一段具有一定格式的標籤資料和引數,核心和loader所共知的一種格式,由loader來構造,由核心來讀取);通過loader或核心配置的命令列引數中應包含 root=/dev/ram的引數;

2.不從外部獲取的情況:

可以在 fix_up 中來設定,就像上面**中提到的一樣:

aster2_fixup(struct machine_desc *desc, struct param_struct *unused,char **cmdline, struct meminfo *mi)

這段**的效果有幾個:

(1) 第一行:設定根檔案系統為 ramdisk(相當於root=/dev/ram0,這種情況下核心命令列引數可以不需要這一行)

(2) 第二行:載入ramdisk;

(3) 第三行:通過setup_initrd設定initrd的引數,即(虛擬的)起始和結束位址;

loader向核心傳引數通過這樣的**: boot_params(0x04000100); 0x04000100是個非常重要的位址,核心將從這個位址開始分析 tag引數,可以傳遞的引數包括:物理記憶體資訊(atag_mem)、ramdisk資訊(atag_ramdisk已經不再使用),initrd資訊(atag_initrd2),序列號(atag_serial),版本號(atag_revision),命令列引數(atag_cmdline)等。loader可以部份或全部設定這些標記。

傳遞 initrd 引數的條件是, image檔案中包含 initrd檔案,即通過 mkimage生成乙個核心與initrd混合的image檔案,然後用bootm,這個引數就可以傳給核心了。核心**中定義的引數位址boot_params(0x04000100)與u-boot中的引數位址必須一致。如果要能載入 initrd 到 ramdisk中,那麼 loader應該將 initrd載入到 (虛)0x04200000位置,讓loader自已傳引數給核心

基於ramdisk在PC上使用FATFS

正文開始 最近想學習fatfs的原始碼,但是手上沒拿板子,而且可能需要實際除錯看程式怎麼執行的,這麼幹很容易壞sd卡。正好看到有人說可以使用ramdisk來模擬硬碟,而且可以在pc上執行,簡直完美。先說一下怎麼開啟ramdisk,這個是基礎。當然是使用createfile writefile and...

在中使用SQLDMO

曾幾何時,夥伴們為的公升級傷透了腦筋.往往程式的公升級趕不上資料庫的公升級 版本控制的好,這也許不是什麼問題,但對於很大一部分中國公司來說這是無法避免的 而有些n久以前的資料庫要使用新程式的時候,資料庫的公升級簡直就是無從下手.所以對比資料庫公升級的緊要性就逐漸的凸現出來.對於表和字段的公升級按道理...

在ARM交叉編譯器中使用嵌入式彙編

最近在做專案的過程中碰到這樣的需求,提取了商業資訊之後,技術上的說法就是呼叫的程式要返回自己的位址。開始考慮內嵌彙編。可是問題很多。最大的問題就是在gaio編譯器中不支援c的變數位址傳遞。可能是和arm彙編中使用十位的第一有關係。最後可用的解決方法是呼叫是先呼叫一段組合語言,這段組合語言得到呼叫的位...