標籤:style blog class c code tar
pcDuino3下支援mmc啟動,官方的Uboot是採用SPL架構實現的,因為內部的SRAM空間達到32K,我們完全可以在這32K空間內編寫一個完整可用小巧的bootloader來完成引導Linux kernel的目的。
我們首先介紹下SPL架構,可以先看下《GNU ARM彙編--(十八)u-boot-採用nand_spl方式的啟動方法》和《GNU ARM彙編--(十九)u-boot-nand-spl啟動過程分析》,NAND_SPL也算是SPL架構下的一種模式。
當使用Nand flash或者MMC作為引導方式時,我們需要使用晶片內的ROM或者其它機制載入韌體到SRAM中。
這種時候就需要SPL,因為SPL短小精悍,適用於4K甚至更小的SRAM的環境。這時候的引導過程就變成,SPL引導Uboot,而由Uboot引導系統核心。
其實作為pcDuino3的SPL,它是可以完成直接引導kernel功能的,如果不需要使用uboot提供的額外的強大功能的話。
這裡介紹下寫bootloader的思路:
使用mmc的read驅動函數將指定位置的kernel鏡像讀取到記憶體中,然後按照Linux的要求完成參數列表的傳遞,MMU和cache的配置等,就可以完成跳轉動作了。
最後一個步驟的代碼如下:
void boot_linux(void){uart_printf("boot linux\n");void (*kernel_entry)(int zero, int arch, uint params);unsigned long r2;unsigned long machid;setup_linux_param(0x40000000 + 0x100);cleanup_before_linux();kernel_entry = (void (*)(int, int, uint))0x48000000;machid = 4283;r2= 0x40000100;kernel_entry(0, machid, r2);}這個函數就完成了核心文檔Documentation/arm/booting對booting ARM Linux的描述。
這樣,一個僅僅有18K大小的bootloader就可以完成對kernel的引導了。