程式記憶體空間的分配

2021-06-21 22:23:42 字數 1047 閱讀 9876

關於程式記憶體空間的分配

mcu的memory中分為不同的area,比如說rl78/g14的memory map如下圖:

其中不同的memory area有不同的用途。按照從下向上的順序:

1、  code flash memory

這個顧名思義就是目標程式所佔據的位置。這裡應該更確切的說一下,程式中涉及到**的部分肯定是佔據這個空間的。

2、  special function register (2nd sfr)

這個還需要在研究一下,應該是renesas微控制器獨有的memory區域。

3、  data flash memory

掉電不丟失的儲存區域。只能被flash memory programmer或者是外部裝置寫,cpu只能讀取data flash memory。這裡的外部裝置,可以是dma,這一點我曾經驗證過。

4、  mirror

這個區域有可能也是renesas所特有,功能再述。

5、  ram

這個區域也是比較容易理解的,程式在執行過程中建立的變數都會處在這個區域中。既然是執行過程中的,那麼當然是自動變數(auto)都會被分配到這裡來。

這裡需要詳細說明一下程式執行過程中,會有自己的堆疊區,sp的初始指向應該在該區域內。當程式執行時,每當函式建立乙個變數時,就會將該變數壓入當前堆疊當中,當該函式執行完成返回時,又將會壓入棧中的資料彈回到相應的變數……

這個區域是最有意思的區域。這裡需要先交代一下在c語言源程式中變數的分類。按照儲存型別分為:

a)        自動(auto)

b)        暫存器(register)

c)        靜態、空鏈結(**塊兒作用域,static)

d)        靜態、外部鏈結(檔案作用域,extern)

e)        靜態、內部鏈結(檔案作用域,static)

6、  general-purpose register

當然是register變數

Linux程式記憶體空間分配

先來看一段簡單 include include int main 執行結果 這時另開乙個終端,輸入cat proc 10073 maps,出現如下顯示 實際上,第一行是 區所佔的記憶體空間,804800 804900,實際上幾乎所有的linux程式 段都是從804800開始的,第二行是全域性棧區所佔...

分配記憶體空間

void calloc size t nobj,size t size 分配足夠的記憶體給nobj個大小為size的物件組成的陣列,並返回指向所分配區域的第乙個位元組的指標 若記憶體不夠,則返回null.該空間的初始化大小為0位元組.char p char calloc 100,sizeof cha...

記憶體空間與分配

1 記憶體分配錯誤 動態記憶體分配錯誤有兩種基本型別 記憶體錯誤和記憶體洩漏。1 記憶體錯誤 當乙個指標或者該指標所指向的記憶體單元成為無效單元,或者記憶體中分配的資料結構被破壞時,就會造成記憶體錯誤。指標未被初始化,指標被初始化為乙個無效位址,指標被不小心錯誤地修改,在與指標相關聯的記憶體區域被釋...