freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

u-boot啟動過程--詳細版的完全分析-資料下載頁

2025-06-29 09:06本頁面
  

【正文】 sh還是從NAND Flash啟動,地址0處為UBoot的第一條指令“ b start_code”。 對于從NAND Flash啟動的情況,其開始4KB的代碼會被自動復制到CPU內部4K內存中,因此可以通過直接賦值的方法來修改。 對于從NOR Flash啟動的情況,NOR Flash的開始地址即為0,必須通過一定的命令序列才能向NOR Flash中寫數(shù)據(jù),所以可以根據(jù)這點差別來分辨是從NAND Flash還是NOR Flash啟動:向地址0寫入一個數(shù)據(jù),然后讀出來,如果發(fā)現(xiàn)寫入失敗的就是NOR Flash,否則就是NAND Flash。 下面來分析NOR Flash啟動部分代碼:208 adr r0, _startADR的定義為:小范圍的地址讀取偽指令,ADR指令將基于PC相對偏移的地址值讀取到寄存器中209 ldr r1, _TEXT_BASE210 cmp r0, r1如果r0=r1 那么跳轉到stack——setup211 beq stack_setup 213 ldr r2, _armboot_start /*flash中armboot_start的起始地址*/214 ldr r3, _bss_start /*uboot_bss的起始地址*/215 sub r2, r3, r2 /* r2 size of armbootuboot實際程序代碼的大小 */216 add r2, r0, r2218 copy_loop:219 ldmia r0!, {r3r10} /* 從地址為[r0]的NOR Flash中讀入8個字的數(shù)據(jù) r0+8 */220 stmia r1!, {r3r10} /* 將r3至r10寄存器的數(shù)據(jù)復制給地址為[r1]的內存 r1+8 */221 cmp r0, r2 222 ble copy_loop(10)設置堆棧 調用c函數(shù)就要設置棧 (sp指向內存)stack_setup: ldr r0, _TEXT_BASE sub r0, r0, CONFIG_SYS_MALLOC_LEN /* malloc area */ sub r0, r0, CONFIG_SYS_GBL_DATA_SIZE /* 跳過全局數(shù)據(jù)區(qū) */ifdef CONFIG_USE_IRQ sub r0, r0, (CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)endif sub sp, r0, 12 /* leave 3 words for abortstack */這段代碼的作用是用來分配各個??臻g,包括分配動態(tài)內存區(qū),全局數(shù)據(jù)區(qū),IRQ和FIQ的棧空間等。只要將sp指針指向一段沒有被使用的內存就完成棧的設置了。根據(jù)上面的代碼可以知道UBoot內存使用情況了,如下圖所示: UBoot內存使用情況(11)清除BSS段clear_bss: ldr r0, _bss_start /* BSS段開始地址,*/ ldr r1, _bss_end /* BSS段結束地址,*/ mov r2, 0x00000000 clbss_l:str r2, [r0] /* 將bss段清零*/ add r0, r0, 4 cmp r0, r1 ble clbss_l這段代碼先設置了BSS段的起始地址與結束地址,然后循環(huán)清除所有的BSS段。至此,所有的CPU初始化工作(stage1階段)已經全部結束了。后面的代碼,將通過ldr pc, _start_armboot,進入C程序代碼執(zhí)行,啟動C語言程序,同時也是整個uboot的主函數(shù)。(12)跳轉到第二階段代碼入口 ldr pc, _start_armboot_start_armboot: .word start_armboot 跳轉到第二階段代碼入口start_armboot處。 UBoot啟動第二階段代碼分析 start_armboot函數(shù)在lib_arm/,是UBoot第二階段代碼的入口。UBoot啟動第二階段流程如下:圖 UBoot第二階段執(zhí)行流程 在分析start_armboot函數(shù)前先來看看一些重要的數(shù)據(jù)結構:(1)gd_t結構體 gd_t全局數(shù)據(jù)結構,主要保存了uboot的配置信息 UBoot使用了一個結構體gd_t來存儲全局數(shù)據(jù)區(qū)的數(shù)據(jù),這個結構體在include/asmarm/:typedef struct global_data {bd_t*bd。//板子相關的結構體unsigned long flags。//unsigned long baudrate。//波特率unsigned long have_console。 /串口調用*/unsigned long reloc_off。 / Relocation Offset 重定位偏移*/unsigned long env_addr。 / 環(huán)境變量基址*/unsigned long env_valid。 / Checksum of Environment valid? */unsigned long fb_base。 /幀緩沖基地址*/ifdef CONFIG_VFDunsigned char vfd_type。 / display type */endifif 0unsigned long cpu_clk。 / cpu頻率!*/unsigned long bus_clk。/總線頻率*/phys_size_t ram_size。 /RAM大小設置,64M*/unsigned long reset_status。 / 重新設置狀態(tài)地址*/endifvoid**jt。/ jump table 保存著些函數(shù)的入口地址,在mon/*/} gd_t。 UBoot使用了一個存儲在寄存器中的指針gd來記錄全局數(shù)據(jù)區(qū)的地址:define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm (r8)這個聲明告訴編譯器使用寄存器r8來存儲gd_t類型的指針gd,即這個定義聲明了一個指針,并且指明了它的存儲位置。register表示變量放在機器的寄存器volatile用于指定變量的值可以由外部過程異步修改 DECLARE_GLOBAL_DATA_PTR定義(宏定義)一個gd_t全局數(shù)據(jù)結構的指針,這個指針存放在指定的寄存器r8中。這個聲明也避免編譯器把r8分配給其它的變量。任何想要訪問全局數(shù)據(jù)區(qū)的代碼,只要代碼開頭加入“DECLARE_GLOBAL_DATA_PTR”一行代碼,然后就可以使用gd指針來訪問全局數(shù)據(jù)區(qū)了。 根據(jù)UBoot內存使用圖中可以計算gd的值:gd = TEXT_BASE -CONFIG_SYS_MALLOC_LEN - sizeof(gd_t) (2)bd_t結構體 bd_t板子數(shù)據(jù)結構體,主要保存與板子相關的信息 bd_t在include/:typedef struct bd_info { int bi_baudrate。 /* 串口通訊波特率 */ unsigned long bi_ip_addr。 /* IP 地址*/ struct environment_s *bi_env。 /* 環(huán)境變量開始地址 */ ulong bi_arch_number。 /* 開發(fā)板的機器碼 */ ulong bi_boot_params。 /* 內核參數(shù)的開始地址 */ struct /* RAM配置信息 */ { ulong start。 ulong size。 }bi_dram[CONFIG_NR_DRAM_BANKS]。 } bd_t。 UBoot啟動內核時要給內核傳遞參數(shù),這時就要使用gd_t,bd_t結構體中的信息來設置標記列表。 第一階段調用start_armboot指向C語言執(zhí)行代碼區(qū),首先它要從內存上的重定位數(shù)據(jù)獲得不完全配置的全局數(shù)據(jù)表格和板級信息表格,即獲得gd_t和bd_t,這兩個類型變量記錄了剛啟動時的信息,并將要記錄作為引導內核和文件系統(tǒng)的參數(shù),如bootargs等等,并且將來還會在啟動內核時,由uboot交由kernel時會有所用。(3)init_sequence數(shù)組 UBoot使用一個數(shù)組init_sequence來存儲對于大多數(shù)開發(fā)板都要執(zhí)行的初始化函數(shù)的函數(shù)指針。init_sequence數(shù)組中有較多的編譯選項,去掉編譯選項后init_sequence數(shù)組如下所示:typedef int (init_fnc_t) (void)。 定義函數(shù)指針;init_fnc_t *init_sequence[] = { board_init, /*開發(fā)板相關的配置board/samsung/mini2440/ */ timer_init, /* 時鐘初始化 cpu/arm920t/s3c24x0/ */ env_init, /*初始化環(huán)境變量mon/ 或mon/*/ init_baudrate, /*初始化波特率 lib_arm/ */ serial_init, /* 串口初始化 drivers/serial/ */ console_init_f, /* 控制通訊臺初始化階段1 mon/ */ display_banner, /*打印UBoot版本、編譯的時間 gedit lib_arm/ */ dram_init, /*配置可用的RAM board/samsung/mini2440/ */ display_dram_config, /* 顯示RAM大小 lib_arm/ */ NULL,}。 其中的board_init函數(shù)在board/samsung/mini2440/,該函數(shù)設置了MPLLCOM,UPLLCON,以及一些GPIO寄存器的值,還設置了UBoot機器碼和內核啟動參數(shù)地址 :/* MINI2440開發(fā)板的機器碼 */gdbdbi_arch_number = MACH_TYPE_MINI2440。/* 內核啟動參數(shù)地址 */gdbdbi_boot_params = 0x30000100。 其中的dram_init函數(shù)在board/samsung/mini2440/:int dram_init (void){ /* 由于mini2440只有 */ gdbdbi_dram[0].start = PHYS_SDRAM_1。 gdbdbi_dram[0].size = PHYS_SDRAM_1_SIZE。 return 0。}mini2440使用2片32MB的SDRAM組成了64MB的內存,接在存儲控制器的BANK6,地址空間是0x30000000~0x34000000
點擊復制文檔內容
范文總結相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1