uboot 重定位 nand norflash啟動

2021-09-22 01:31:16 字數 2450 閱讀 4127

##nand flash啟動

cpu無法給nand flash傳送指令,因此無法從nand flash中取指令的。那麼上電後,為啥依然可以從nand flash中啟動uboot呢?

1.硬體會自動將nand flash的**前4k拷貝到sram(片內記憶體,steppintstone)中。cpu從sram的0位址中執行**。如果uboot的**大於4k怎麼辦?uboot中前4k的**需要初始化nand flash,sdram,並將nand flash中整個uboot程式讀出來,拷貝到sdram的中。這個過程其實就是**重定位。

##nor flash啟動

nor flash是記憶體類結構,可以直接向記憶體一樣訪問的,但是無法像記憶體一樣寫。因此,當從nor flash啟動時,cpu會從nor flash的0位址開始執行指令,但是注意指令中只能讀取變數,而無法修改變數的值。所以,也需要把全域性變數和靜態變數重定位到sdram中。

##程式各個**段

.text **段

.data 資料段 (初始化的全域性變數或者靜態區域性變數)

rodata 唯讀資料段(const全域性變數)

bss段 (初始值為0,未初始化的全域性變數)

commen 注釋

其中bss段和commen 注釋不儲存在bin檔案中。

##關於lds的實驗

實驗**來自於韋東山的嵌入式課本原始碼: hardware\i2c

鏈結指令碼

sections 

. = 0x30000000;

.text : at(4096)

.rodata align(4) : at((loadaddr(.text)+sizeof(.text)+3)&~(0x03))

.data align(4) : at((loadaddr(.rodata)+sizeof(.rodata)+3)&~(0x03))

__bss_start = .;

.bss align(4) :

__bss_end = .;

}

反彙編檔案:

i2c_elf:     file format elf32-littlearm

disassembly of section .init:

00000000 <_start>:

0: ea000006 b 20 00000004 :

4: eafffffe b 4 00000008 :

8: eafffffe b 8 0000000c :

c: eafffffe b c 00000010 :

…………

5a0: 00696261 .word 0x00696261

5a4: 00000501 .word 0x00000501

5a8: 00000000 .word 0x00000000

disassembly of section .text: #**段的開始,如lds指令碼,開始位址為30000000。之前存放的是初始化段,包含head.o init.o nand.o 三個檔案的**

30000000 :

30000000: e59f2030 ldr r2, [pc, #48] ; 30000038 30000004: e59f1030 ldr r1, [pc, #48] ; 3000003c 30000008: e28230c8 add r3, r2, #200 ; 0xc8

3000000c: e4821004 str r1, [r2], #4

30000010: e1520003 cmp r2, r3

30000014: 1afffffc bne 3000000c 30000018: e59f3020 ldr r3, [pc, #32] ; 30000040 3000001c: e3a0144a mov r1, #1241513984 ; 0x4a000000

30000020: e502305c str r3, [r2, #-92]

##lds檔案解析

sections 

. = 0x40000000; ##表示之後的各個段彙編**的絕對路徑。指令中絕對跳轉使用的就是這個位址。對應於執行位址、鏈結位址。

.text : at(2048) ##at表示這個段放在bin檔案偏移2048的位置。可以用ue開啟檔案,在2048位址處檢視到對應的機器碼。對應於載入位址。

.rodata align(4) : at((loadaddr(.text)+sizeof(.text)+3)&~(0x03))

.data align(4) : at((loadaddr(.rodata)+sizeof(.rodata)+3)&~(0x03))

__bss_start = .;

.bss align(4) :

__bss_end = .;

}

u boot中重定位

在學習 u boot的時候,對程式重定位不理解,不知道為什麼要進行重定位,在網上查詢資料學習了一下。首先,要了解一下乙個程式的生成的四個步驟 預處理 編譯 彙編 鏈結。經過這四步,最終才生成可執行檔案bin檔案。預處理主要是巨集定義的展開,編譯主要是進行語法此分析,如我們常見的語法錯誤,某些函式未定...

如何讓U boot實現Nand Nor 雙啟動

華清遠見嵌入式學院 講師。在做u boot移植的時候,多數人使用的是nand flash啟動或nar flash啟動。這樣u boot就只能在nand flash或nor flash。那麼我們如何讓我們的u boot在nand flash或nor flash都能使用。首先,我們說說u boot,u ...

如何讓U boot實現Nand Nor 雙啟動

如何讓u boot實現nand nor 雙啟動 在做u boot移植的時候,多數人使用的是nand flash啟動或nar flash啟動。這樣u boot就只能在nand flash或nor flash。那麼我們如何讓我們的u boot在nand flash或nor flash都能使用。首先,我們...