資源描述:
《U-Boot啟動第二階段代碼分析》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、U-Boot啟動第二階段代碼分析(2012-03-2315:10)一鍵轉(zhuǎn)載標(biāo)簽:二分類:ubootU-Boot第一階段的啟動流程。(nandflash啟動,把nand的4k代碼考到sram中,因為nand沒址線,不能映射到內(nèi)存,所以通過sram進(jìn)行過度,sram中4k代碼把整個uboot拷貝到sdram上,初始化好堆棧,為c語言提供條件,進(jìn)入uboot的第二階段!)這個階段主要是初始化硬件設(shè)備,為加載U-Boot的第二階段代碼準(zhǔn)備RAM空間最后跳轉(zhuǎn)到lib_arm/board.c中start_armboot函數(shù),這是第二階段的入口點。在上一篇文
2、章中,我們介紹了u-boot啟動的時候匯編語言的部分,當(dāng)時我們進(jìn)行了一些簡單的初始化,并且為C語言的執(zhí)行建立的環(huán)境(堆棧),現(xiàn)在我們看看當(dāng)從匯編語言轉(zhuǎn)到C語言的時候執(zhí)行的第一個函數(shù)(start_armboot(),在lib_armboard.c中),該函數(shù)進(jìn)行了一系列的外設(shè)初始化,然后調(diào)用main_loop(),根據(jù)配置來選擇是直接加載Linux內(nèi)核還是進(jìn)入等待命令模式。1、在介紹該函數(shù)之前,我們需要看一看幾個數(shù)據(jù)結(jié)構(gòu),這些是u-boot中幾個重要的數(shù)據(jù)結(jié)構(gòu):(1)gd_t結(jié)構(gòu)體U-Boot使用了一個結(jié)構(gòu)體gd_t來存儲全局?jǐn)?shù)據(jù)區(qū)的數(shù)據(jù),這個
3、結(jié)構(gòu)體在include/asm-arm/global_data.h中定義如下:typedefstructglobal_data{bd_t*bd;//與板子相關(guān)的結(jié)構(gòu),見下面unsignedlongflags;unsignedlongbaudrate;unsignedlonghave_console;/*serial_init()wascalled*/unsignedlongreloc_off;/*RelocationOffset*/unsignedlongenv_addr;/*AddressofEnvironmentstruct*/unsign
4、edlongenv_valid;/*ChecksumofEnvironmentvalid?*/unsignedlongfb_base;/*baseaddressofframebuffer*/#ifdefCONFIG_VFD//我們一般沒有配置這個,這個是framebuffer的首地址unsignedcharvfd_type;/*displaytype*/#endif#if0unsignedlongcpu_clk;/*CPUclockinHz!*/unsignedlongbus_clk;unsignedlongram_size;/*RAMsize
5、*/unsignedlongreset_status;/*resetstatusregisteratboot*/#endifvoid**jt;/*jumptable*/}gd_t;/**GlobalDataFlags*/#defineGD_FLG_RELOC0x00001/*CodewasrelocatedtoRAM*/#defineGD_FLG_DEVINIT0x00002/*Deviceshavebeeninitialized*/#defineGD_FLG_SILENT0x00004/*Silentmode*/#defineDECLARE_
6、GLOBAL_DATA_PTRregistervolatilegd_t*gdasm("r8")在global_data.h中U-Boot使用了一個存儲在寄存器中的指針gd來記錄全局?jǐn)?shù)據(jù)區(qū)的地址:#defineDECLARE_GLOBAL_DATA_PTRregistervolatilegd_t*gdasm("r8")DECLARE_GLOBAL_DATA_PTR定義一個gd_t全局?jǐn)?shù)據(jù)結(jié)構(gòu)的指針,這個指針存放在指定的寄存器r8中。這個聲明也避免編譯器把r8分配給其它的變量。任何想要訪問全局?jǐn)?shù)據(jù)區(qū)的代碼,只要代碼開頭加入“DECLARE_GLOB
7、AL_DATA_PTR”一行代碼,然后就可以使用gd指針來訪問全局?jǐn)?shù)據(jù)區(qū)了。根據(jù)U-Boot內(nèi)存使用圖中可以計算gd的值:gd=TEXT_BASE-CONFIG_SYS_MALLOC_LEN-sizeof(gd_t)2)bd_t保存與板子相關(guān)的配置參數(shù)bd_t在include/asm-arm/u-boot.h中定義如下:typedefstructbd_info{intbi_baudrate;/*串口通訊波特率*/unsignedlongbi_ip_addr;/*IP地址*/unsignedcharbi_enetaddr[6];/*Etherne
8、tadress*/structenvironment_s*bi_env;/*環(huán)境變量開始地址*/ulongbi_arch_number;/*uniqu