Link.ld 連結指令碼記憶體解析
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
unsigned int bss_test_array[1024 * 1024];
unsigned int bss_test_char = 0;
unsigned int data_test_array[10] = {0,1,2,3,4,5,6,7,8,9};
unsigned int data_test_char = 0xFF;
const unsigned int rodata_test_array[5] = {0,1,2,3,4};
int main(int argc,char *argv[])
{
int bss_size = sizeof(bss_test_array);
printf("I am Chinese!");
return 0;
}
1.未初始化的全域性變數(.bss段)
bss段用來存放 沒有被初始化 和 已經被初始化為0 的全域性變數。如下例程式碼:
unsigned int bss_test_array[1024*1024];
unsigned int bss_test_char = 0;
2. 已被初始化為非零的全域性變數(.data段)
unsigned int data_test_array[10] = {0,1,2,3,4,5,6,7,8,9};
unsigned int data_test_char = 0xFF;
3.常量資料(.rodata段)
1)rodata用來存放常量資料。 ro: read only;
2)字串會被編譯器自動放在rodata中,加 const 關鍵字的常量資料會被放在 rodata 中;如:
const unsigned int rodata_test_array[5] = {0,1,2,3,4};
printf(“I an Chinese”);
4.程式碼(.text段)
text段存放程式碼(如:函式)和部分整數常量(應該指的是一些立即數),這個段是可執行的。
5.棧(stack)
1)stack 存放函式的區域性變數和函式引數
2)被呼叫函式的引數和返回值 被儲存到當前程式的棧區,之後被呼叫函式再為自身的自動變數和臨時變數在棧區上分配空間
3)函式返回時,棧區的資料會被釋放掉,先入後出(FILO)的順序。
6.堆(heap)
heap用來動態分配記憶體,由程式自身決定開闢和釋放。
7.smll data初始化段
.sdata是指smll data初始化段(小於多少可以算small data,可以在codewarrior中設定)用於存放“近”資料,即使用短指標(near)定址的資料。有利於小的物件組合到單個可以直接定址的區域;
8.small data未初始化段
.sbss 是指small data未初始化段。
系統設定棧指標,以MIPS為列,在bootup.S中呼叫
La sp,_stack_top_addr; $sp堆疊指標(Stack Pointer)
La gp,_gp_top_addr; $gp(全域性指標(Global Pointer)
mips指令簡單入門:
Link.ld 指令碼詳解