(ARM)程序啟動過程
1 加載文件(sct ld等)
本文引用地址:http://butianyuan.cn/article/201611/319401.htm2 bin/image文件
一個簡單的image文件主要包括以下三項:
RO區(qū)域:程序中的指令和常量,read only
RW區(qū)域:程序中已經初始化的變量, read/write
ZI區(qū)域:?初始化為0或者未被初始化的變量。zero
一個工程文件在make執(zhí)行完之后會在最后顯示一個代碼大小的數據:
Total RO size:Code+RO
Total RW size:RO + ZI
Total ROM size:Code + RO + RW 即image文件不包含zi段的。
?
?
鏈接器將RO區(qū)域定位在 -RO-Base 開始的地址,如ROM空間的起始地址上。相應的-RW-Base指的是RW區(qū)域代碼的執(zhí)行地址。值得注意的是鏈接器在創(chuàng)建上述區(qū)域的同時會產生相應的符號并把加載地址信息傳遞給這些符號。如果區(qū)域的加載地址和執(zhí)行地址不一樣的話,程序在運行之前,應首先完成對該區(qū)域代碼的拷貝工作。值得注意的是完成拷貝的工作是由編譯器調用相關庫函數完成的。并且這部分代碼是包含在image文件當中的。
注:當使用自己的加載sct文件時將不會產生下面的幾個如Image$$RO$$BASE等符號,本文重點講解的是使用sct文件的情況,但為了知識的全面性,以下仍將有關符號信息做簡單介紹。
Image$$RO$$BASE:是RO段的執(zhí)行地址,同時也是裝載地址。
Image$$RO$$Limit: 是RO段裝載地址結束的后一個地址,也就是RW段的裝載起始地址。
Image$$RW$$Base是RW段執(zhí)行地址,通常RW段的裝載地址和執(zhí)行地址不一樣,程序運行之前需要將從Image$$RO$$Limit-1開始的代碼拷貝到由Image$$RW$$BASE指定的地址處。即將RW段從ROM中搬到RAM中。
Image$$ZI$$Base是ZI區(qū)在RAM里面的起始地址。
Image$$ZI$$Limit是ZI區(qū)在RAM里面結束地址后面的那一個地址。?
3程序的啟動
?如上所述,燒錄到ROM中的程序跟運行起來的程序是由很大差別的。那么ROM中的程序如何從image中到達實際運行狀態(tài)的呢?
首先,ROM中的指令,應具有RW段拷貝的功能。然后將ZI段所在的區(qū)域全部清0功能,即需要根據編譯器給出的ZI地址和大小來將相應的RAM區(qū)域全部清0的工作。?
評論