轉自:http://blog.csdn.net/blueoceanindream/article/details/6851787
閑來無事,總結一下linux bootrom的啟動流程:
環境:MIPS+linux+交換機
nor flash和nand flash
nor flash:引腳多;支持片內執行;
nand flash:引腳通過IO串行實現,不支持片內執行;
一.基本概念
對於linux的bootloader主要可以分為四個層次:
1.firmware+bootloader
采用固件和bootloader兩部分的bootrom方式,在Marvell平台中,CPU中集成了bootrom芯片,實質上是nand flash,CPU上電啟動過程中,先執行固件中的程序,然后再執行boot代碼。由於固件中代碼已經初始化了串口,因此我們開發boot中不需要顧及串口初始化。
2.linux內核參數傳遞
不止是linux,vxworks也一樣,image參數主要通過bootloader進行傳遞,或者是系統默認的,在我們系統中,都是采用bootloader把參數設置好,向image傳遞固定數據結構的地址,image啟動時就能夠獲取參數,並按照預定的方式啟動。
3.文件系統
主要是基於Flash等內存設備上,包含linux運行時所用的應用程序、庫等,比如說給開發提供的Shell、動態鏈接程序。
4.用戶應用程序
存儲在文件系統中,例如會在文件系統和內核總放置一個圖形化界面,例如minigui。
linux 常見分區:
bootloader + boot parameter + linux kernel + boot filesystem
二.boot常見的啟動階段
在我們產品中,首先設置CPU status寄存器KX,SX,UX;然后讀取是哪個CORE,決定走不同的分支;然后讀取不同的芯片版本,決定走不同分支;並區分是軟復位和硬復位;區分不同的CORE,初始化相應的TLB映射,並根據不同的CORE,計算每個CORE需要執行的代碼段。
函數board_init_f()是在flash中執行的,是重要函數。
board_init_f()中調用lib_mips/board.c文件中定義的 init_sequence[]函數指針數組中的函數
init_fnc_t *init_sequence[] = {
octeon_boot_bus_init, ----> lib_mips/lib_octeon.c/octeon_boot_bus_init()
timer_init, ----> lib_mips/time.c/timer_init()
env_init, ----> common/env_flash.c/env_init() /*CFG_ENV_IS_IN_FLASH*/
early_board_init, ----> board/octeon_ebt3000/octeon_ebt3000_board.c
init_baudrate, ----> lib_mips/board.c/init_baudrate()
serial_init, ----> 無
console_init_f, ----> common/console.c/console_init_f()
display_banner, ----> lib_mips/board.c/display_banner()
init_dram, ----> lib_mips/board.c/init_dram()
checkboard, ----> board/octeon_ebt3000/octeon_ebt3000_board.c
init_func_ram,
NULL,
};
