13.1代碼重定位_段的概念
S3C2440的CPU可以直接給SDRAM發(fā)送命令、給Nor Flash發(fā)送命令、給4K的片上SRAM發(fā)送命令,但是不能直接給Nand Flsh發(fā)送命令
假如把程序燒寫到Nand Flsh上,即向Nand Flsh燒入 bin 文件,CPU是無(wú)法從Nand Flsh中取代碼執(zhí)行的。
為什還可以使用NAND啟動(dòng)?
上電后,Nand啟動(dòng)硬件會(huì)自動(dòng)把Nand Flsh前4K復(fù)制到SRAM;
CPU從0地址運(yùn)行SRAM;
如果我的程序大于4K怎么辦?
前4K的代碼需要把整個(gè)程序讀出來(lái)放到SDRAM(即代碼重定位)。
如果從Nor Flash啟動(dòng),會(huì)出現(xiàn)什么問(wèn)題?
將撥動(dòng)開(kāi)關(guān)撥到Nor Flash啟動(dòng)時(shí),此時(shí)CPU認(rèn)為的 0地址 在Nor Flash上面,片內(nèi)內(nèi)存SRAM的基地址就變成了0x40000000(Nand啟動(dòng)時(shí)片內(nèi)內(nèi)存SRAM的基地址基地址是0),由于Nor Flash特性:可以像內(nèi)存一樣讀,但不能像內(nèi)存直接寫,因此需要把全局變量和靜態(tài)變量重定位 放到SDRAM里。
例如執(zhí)行如下幾條匯編指令?

當(dāng)程序中含有需要寫的全局變量或靜態(tài)變量時(shí),假如是在Nand Flash可以正常操作,如果是在Nor Flash,修改無(wú)效。因此我們需要把全局變量和靜態(tài)變量重定位 放到SDRAM?

編譯運(yùn)行查看是否有效果
查看sdram.dis文件 發(fā)現(xiàn)data數(shù)據(jù)段放在了0x00008474這個(gè)地址導(dǎo)致 程序太大
在makefile中加入這么一句話?
arm-linux-ld -Ttext 0 -Tdata 0x700 start.o led.o uart.o init.o main.o -o sdram.elf
16進(jìn)制的700就是十進(jìn)制的2048 這時(shí)我們的bin文件就變?yōu)?049?
燒寫程序:
燒寫在NORFlash 和 燒寫在NANDFlash觀察這兩種的效果。
設(shè)置成NANDFlash啟動(dòng)沒(méi)有問(wèn)題 顯示ABCDE...
設(shè)置成NORFlash啟動(dòng)顯示AAA...
對(duì)于NOR啟動(dòng)時(shí)
g_Char++; ? ? ? ? /* nor啟動(dòng)時(shí), 此代碼無(wú)效 */

一個(gè)程序里面有
.text 代碼段
.data 數(shù)據(jù)段
rodata 只讀數(shù)據(jù)段(const全局變量)
bss段 (初始值為0,無(wú)初始值的全局變量)
commen 注釋
其中bss段和commen 注釋不保存在bin文件中。?