1. 程式人生 > >微控制器記憶體分配之 .data .bss .rodata段

微控制器記憶體分配之 .data .bss .rodata段

一、概念

.bss段

    存放沒有初始化或者初始化為0的全域性變數或者靜態區域性變數。

.data段

    存放初始化為非0,且非const屬性的全域性變數或者靜態區域性變數。

.rodata段

    存放字串和const常量,一般只放在ROM中。

二、實驗

1.工具鏈:

    GNU Tools ARM Embedded(win)

2.C程式碼:

    
int im_data = 3;                       
int im_bss;
int im_bss_0 = 0;
const int im_rodata = 1;
static int im_data_sta = 1;
static int im_bss_sta_0 = 0;
static int im_bss_sta;
char *im_rodata_str = "length_10";

int main(void){
	static int im_data_func = 1;
	static int im_bss_func;
	return 0;
}

3.測試過程

    1>make 產生elf檔案

    2>arm-none-eabi-objdump -t elf 列印符號列表,如下


    3>分析:

初始化為非零的全域性變數和靜態變數有:im_data、im_data_sta、im_data_func,它們存放在.data記憶體段中,im_rodata_str是指標型全域性變數,也存放在.data中。

初始化為0和未初始化的的全域性變數和靜態變數有:im_bss、im_bss_0、im_bss_sta_0、im_bss_sta、im_bss_func,它們被存放在.bss段中。

字串"length_10"和const常量im_rodata被存放在.rodata中("length_10"未引出符號表,但被存放在rodata中)。

相關推薦

微控制器記憶體分配 .data .bss .rodata

一、概念.bss段    存放沒有初始化或者初始化為0的全域性變數或者靜態區域性變數。.data段    存放初始化為非0,且非const屬性的全域性變數或者靜態區域性變數。.rodata段    存放字串和const常量,一般只放在ROM中。二、實驗1.工具鏈:    GN

java記憶體分配堆,棧,常量池,方法區

java棧 java棧,在函式的定義中定義的基本型別(int,long,short,byte,float,double,boolean,char)的變數資料和物件的引用變數分配的儲存空間的地方。當在程式碼塊中定義一個變數時,java棧就為這個變數分配適當的記憶體空間,當該變數退出作用域時,jav

C和指標動態記憶體分配(編寫calloc函式,函式內部使用malloc函式來獲取記憶體)

1、問題 編寫calloc函式,函式內部使用malloc函式來獲取記憶體 2、程式碼實現 #include <stdio.h> #include <stdlib.h&

程式的記憶體分配堆和棧的區別

堆疊概述   在計算機領域,堆疊是一個不容忽視的概念,堆疊是兩種資料結構。堆疊都是一種資料項按序排列的資料結構,只能在一端(稱為棧頂(top))對資料項進行插入和刪除。在微控制器應用中,堆疊是個特殊的儲存區,主要功能是暫時存放資料和地址,通常用來保護斷點和現場

陣列記憶體分配堆、棧

首先看一下陣列: 陣列是儲存同一種資料型別多個元素的集合。也可以看成是一個容器。 陣列既可以儲存基本資料型別,也可以儲存引用資料型別。 陣列的定義格式: 格式1:資料型別[]  陣列名;int[

java虛擬機器記憶體分配新生代與老年代GC

1. Java堆中各代分佈: 圖1:Java堆中各代分佈 Young:主要是用來存放新生的物件。 Old:主要存放應用程式中生命週期長的記憶體物件。 Permanent:是指記憶體的永久儲存區域,主要存放Class和Meta的資訊,Class在被 Load的時候被放入PermGen space區域. 它和

C和指標動態記憶體分配輸入很多整數進行排序

1、問題 讀取一列整數,然後按升序排列它們,最後列印列表 2、程式碼實現 #include <stdio.h> #include <stdlib.h> /** 此函式根據

記憶體分配(堆、棧、BSS、程式碼、資料

這兩天看了馬士兵老師的視訊、視訊中提到了一個萬能鑰匙、就是了解程式執行中對記憶體的操作、主要講了堆、棧、Data、說真的有點暈、看了兩遍、也就略懂一二、在這做個小小知道總結 簡介        

記憶體探尋1——值型別和引用型別的記憶體分配機制

String物件和值型別的記憶體分配機制:           同樣由前延伸,上上篇《由String型別分析,所產生的對引數傳遞之惑的解答》中,最後提及,如果將引用型別的按值傳遞和按引用傳遞,用託管堆表

c++學習路:2.預設引數&函式過載&堆記憶體分配

預設引數 規則:程式從右向左延伸讀取 例子:如下sortarr函式,在創造函式的時候可以直接賦值,這樣執行的時候就執行預設值。 又如debug函式,不傳參就會列印------------------; 函式過載 理解:幾個同名函式,所設有的引數不一樣,就代表為不同函式。 所以傳參的時候

儲存器管理——記憶體分配(分割槽,,頁)

儲存器管理 連續分割槽兩種方式對比 固定分割槽 可變分割槽 分割槽記憶體大小 固定 可變 記憶體利用率 低 提高

虛擬機器學習二:垃圾收集器和記憶體分配策略

1.物件是否可回收 1.1引用計數演算法 引用計數演算法:給物件中新增一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何時候計數器值為0的物件就是不可能再被使用的物件。 客觀來說,引用計數演算法的實現簡單,判定效率高,在大部分情況下都是

Qt隱式共享及記憶體分配策略

一、隱式共享簡介 (來源《Qt5開及發例項》第三版) 隱式共享又稱回寫複製(copy no write)。當兩個物件共享一部分資料時(通過淺拷貝實現資料塊共享),如果資料不變,則不進行資料的複製。而當某個物件需要改變資料時,則執行深拷貝。 程式在處理共享物件時,使用深拷

動態記憶體分配實用案例(二)複製字串

用動態分配記憶體製作一個字串的一份拷貝。注意:呼叫程式應該負責檢查這塊記憶體是否分配成功,這樣做允許程式以任何它所希望的方式對錯誤作出反應。 #nclude <stdlib.h> #include <string.h> char * strdup

【 C 】經典抽象資料型別(ADT)記憶體分配

C中的一些抽象資料型別(ADT)如連結串列、堆疊、佇列和樹等,連結串列已經在前幾篇博文有所討論,見: 後面的博文會相繼討論堆疊、佇列和樹的一些基本的相關知識! 下面記錄一個最基本的問題,記憶體分配問題: 所有的 ADT 都必須明確一個問題,如何獲取記憶體

JVM讀書筆記垃圾收集與記憶體分配

1 概述   說起垃圾收集( Garbage Collection , GC ) ,大部分人都把這項技術當做 Java 語言的伴生產物。事實上, GC 的歷史遠遠比 Java 久遠,1960 年誕生於 MIT 的 Lisp 是第一門真正使用記憶體動態分配和垃圾收集技術的語言。當 Lisp 還在胚胎時期時,人們

c++學習路:2.預設引數&函式過載&堆記憶體分配

預設引數 規則:程式從右向左延伸讀取 例子:如下sortarr函式,在創造函式的時候可以直接賦值,這樣執行的時候就執行預設值。 又如debug函式,不傳參就會列印------------------; 函式過載 理解:幾個同名函式,所設有的引數不一樣,就代表為

JNI基礎C動態記憶體分配筆記

當我們在執行下面一段程式碼時,會丟擲stack overflow的異常: #include <stdio.h> void main(){ int i[1024 * 1024 * 10]; getchar(); }   這個錯誤直譯過來就是棧溢位,這裡面

JVM---Java記憶體分配引數

引數總結 配置 說明 -Xms 設定初始堆記憶體大小 -Xmx 設定堆記憶體的最大值 -Xss 設定棧記憶體的大小

深入理解JVMJVM記憶體區域與記憶體分配

部落格出處: http://www.cnblogs.com/hellocsl/p/3969768.html?utm_source=tuicool&utm_medium=referral 先來看看JVM執行時候的記憶體區域   大多數 JVM 將記憶體區域劃分為