分散載入與記憶體佈局

流水江湖發表於2024-05-12
LR_IROM1 0x08000000 0x00010000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00010000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00005000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

這段指令碼定義了兩個記憶體區域:ROM和RAM


LR_IROM1:這是隻讀儲存區(通常指快閃記憶體),用於儲存程式程式碼。
0x08000000 是該區域的起始地址。
0x00010000 是該區域的大小,即64KB


RW_IRAM1:這是讀寫儲存區(通常指RAM),用於儲存程式執行時的可讀寫資料。
0x20000000 是該區域的起始地址。
0x00005000 是該區域的大小,即20KB


程式碼段:
ER_IROM1:定義了執行地址和載入地址相同的區域,通常用於描述韌體程式碼。
*.o (RESET, +First) 指的是將所有包含RESET段的object檔案首先放入這個區域。
*(InRoot$$Sections) 可能是指定某些特定的段。
.ANY (+RO) 指的是所有隻讀段(Read-Only)也就是常量
.ANY (+XO) 可能是指某些特殊的執行只讀段。
.ANY (+RW +ZI) 指的是所有讀寫(Read-Write)和 零初始化(Zero-initialized)的資料段。

在ARM Cortex-M微控制器的上下文中,InRoot$$Sections通常指的是以下節:
.text:包含程式的可執行程式碼。
.rodata:包含只讀資料,例如常量字串和靜態常量
.data:包含已初始化的全域性和靜態變數。
.bss:包含未初始化的全域性和靜態變數(它們在程式啟動時會被初始化為零)。
當你在分散載入檔案中使用InRoot$$Sections時,它通常意味著以下內容:
InRoot:這表示這些節是“在根目錄中”,即它們是主要的、非可選的節,它們必須被包含在最終的二進位制檔案中。
$$Sections:這是一個萬用字元,它代表所有匹配的節。
因此,InRoot$$Sections告訴連結器,所有主要的、非可選的節都應該被放置在指定的記憶體區域中。在分散載入檔案中,它通常與載入和執行區域相關聯,如下所示:

相關文章