SDRAM和重定位

2021-10-04 19:30:45 字數 1702 閱讀 6254

sdram和重定位
①**段:**段通常是指用來存放程式執行**的一塊記憶體區域,這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀。也有可能包含一些唯讀的常數變數,例如字串常量等。

②資料段:用來存放程式中已初始化的全域性變數的一塊記憶體區域,屬於靜態記憶體分配。

③bss段:用來存放程式中未初始化的全域性變數的一塊記憶體區域,block started by symbol,屬於靜態記憶體分配。

④堆:用於存放程序執行中被動態分配的記憶體段,大小並不固定,可動態擴張和縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上;當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除。

⑤棧:又稱堆疊,是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數),棧是由作業系統分配的,記憶體的申請和**都是由os管理。

全域性的未初始化變數存在於bss段中,全域性的已初始化變數存於data段,函式內的自動變數都在棧上分配空間。

#include

#include

// 位於bss段,存放在程式組未初始化的記憶體區域

int bss;

// 位於資料段,存放在程式中已經初始化的記憶體區域

int data =

100;

// 靜態區

static

int y;

intstack

(void);

intmain

(void

)int

stack

(void

)

c語言中全域性變數如果未顯式初始化,值為0。本質就是c語言把這類全域性變數放在了bss段,從而保證了為0;c執行時環境如何保證顯式初始化為非0的全域性變數在main之前就被賦值了,就是因為它把這類變數放在了data段中,而data段會在main執行之前被處理。

清bss段,一般情況下c語言編譯器和鏈結器會幫我們的程式自動新增一段頭程式,這段程式會在我們的main函式之前執行,這段**就負責清除bss,但是在我們**重定位了之後,因為編譯器幫我們附加的**只是幫我們清除了執行位址那乙份**中的bss,而未清除重定位位址處開頭的那乙份**的bss,所以重定位之後需要自己去清除bss。

長跳轉,清理完bss段後重定位就結束了,然後當前狀況是:當前執行位址還在0xd0020010開頭的那乙份**中執行著,此時sram中已經有了2份**,1份在0xd0020010開頭,另乙份在0xd0024000開頭的位置。

1.4.1 sdram(synchonized dynamic random access memory),同步動態隨機儲存器,ddr是sdram的公升級版;特性容量大、**低、掉電易失性、隨機讀寫、匯流排式訪問,相對於靜態記憶體sram屬於動態記憶體,需要先執行一段初始化**來初始化才能使用,不想sram開機上電後就可以直接執行。sdram通過位址匯流排和資料匯流排介面與soc通訊。

sdram初始化,s5pv210共有2個記憶體埠,兩個記憶體埠分別叫dram0和dram1:dram0記憶體範圍0x2000_0000~0x3fff_ffff(512mb),dram1記憶體範圍0x4000_0000 ----0x7fff_ffff。整個210最多支援記憶體為1.5gb,如果給210更多的記憶體cpu就無法識別,但是實際開發板不一定要這麼多,譬如210開發板就只有512mb記憶體,連線方法是在dram0埠分布256mb,在dram1埠分布了256mb。

1 2 SDRAM和重定位

1.位置有關編碼在設計乙個程式時,會給這個程式指定乙個執行位址 鏈結位址 就是說我們在編譯程式時其實心裡是知道我們程式將來被執行時的位址 執行位址 的,而且必須給編譯器鏈結器指定這個位址 鏈結位址 才行。最後得到的二進位制程式理論上是和你指定的執行位址有關的,將來這個程式被執行時必須放在當時編譯鏈結...

5 SDRAM和重定位relocate

看門狗 watch dog timer看門狗定時器 大家想象這樣乙個場景 家門口有乙隻狗,這只狗定時會餓 譬如說2小時一餓 狗餓了會胡亂咬死人。人進進出出要想保證安全必須提前餵狗 必須在上次喂過後的2小時內餵狗才行 如果超時沒餵狗就會被咬死。如果提前餵狗沒關係,但是本次餵狗時間就會從這裡開始計算。看...

重定位和鏈結

鏈結和重定位是嵌入式c中很重要的部分,對於這一塊掌握的越精細越好。指令分為兩種 在程式設計編譯鏈結過程會給程式乙個執行位址,而且必須給編譯聯結器指定這個位址,最後得到的二進位制程式是和指定的鏈結位址相關的,這個位址叫做 鏈結位址 所以我們在程式編譯時其實就已經知道程式將來執行時的位址,這個位址叫做 ...