bootrom啟動流程【轉】


轉自: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,
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM