新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > (ARM)程序啟動過程

        (ARM)程序啟動過程

        作者: 時間:2016-11-21 來源:網絡 收藏
        作為一般的嵌入式程序設計工作者,平時大部分工作應該主要涉及應用層部分的事務,只要編譯工程生成可執行文件,然后把執行文件download到ROM中,就OK了。很少關注燒寫到ROM中的程序是怎么運行起來的這一過程。因為這部分工作大都被集成開發環境給做了。本篇文章,我欲將這不不太被關注的過程給簡單介紹下(很少關注不代表不重要,相反,個人感覺對這一部分的理解,對于一個嵌入式程序開發者來說是一個小小的分水嶺,當然,另外一個重要的分水嶺肯定是操作系統啦)。

        1 加載文件(sct ld等)

        本文引用地址:http://www.104case.com/article/201611/319401.htm

        2 bin/image文件

        一個簡單的image文件主要包括以下三項:

        RO區域:程序中的指令和常量,read only

        RW區域:程序中已經初始化的變量, read/write

        ZI區域:?初始化為0或者未被初始化的變量。zero

        一個工程文件在make執行完之后會在最后顯示一個代碼大小的數據:

        Total RO size:Code+RO

        Total RW size:RO + ZI

        Total ROM size:Code + RO + RW 即image文件不包含zi段的。

        ?

        ?

        鏈接器將RO區域定位在 -RO-Base 開始的地址,如ROM空間的起始地址上。相應的-RW-Base指的是RW區域代碼的執行地址。值得注意的是鏈接器在創建上述區域的同時會產生相應的符號并把加載地址信息傳遞給這些符號。如果區域的加載地址和執行地址不一樣的話,程序在運行之前,應首先完成對該區域代碼的拷貝工作。值得注意的是完成拷貝的工作是由編譯器調用相關庫函數完成的。并且這部分代碼是包含在image文件當中的。

        注:當使用自己的加載sct文件時將不會產生下面的幾個如Image$$RO$$BASE等符號,本文重點講解的是使用sct文件的情況,但為了知識的全面性,以下仍將有關符號信息做簡單介紹。

        Image$$RO$$BASE:是RO段的執行地址,同時也是裝載地址。

        Image$$RO$$Limit: 是RO段裝載地址結束的后一個地址,也就是RW段的裝載起始地址。

        Image$$RW$$Base是RW段執行地址,通常RW段的裝載地址和執行地址不一樣,程序運行之前需要將從Image$$RO$$Limit-1開始的代碼拷貝到由Image$$RW$$BASE指定的地址處。即將RW段從ROM中搬到RAM中。

        Image$$ZI$$Base是ZI區在RAM里面的起始地址。

        Image$$ZI$$Limit是ZI區在RAM里面結束地址后面的那一個地址。?

        3程序的啟動

        ?如上所述,燒錄到ROM中的程序跟運行起來的程序是由很大差別的。那么ROM中的程序如何從image中到達實際運行狀態的呢?

        首先,ROM中的指令,應具有RW段拷貝的功能。然后將ZI段所在的區域全部清0功能,即需要根據編譯器給出的ZI地址和大小來將相應的RAM區域全部清0的工作。?



        關鍵詞: ARM程序啟

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 丰城市| 贡山| 察雅县| 永新县| 杭锦后旗| 澳门| 琼中| 海口市| 方城县| 东阿县| 长沙市| 剑河县| 边坝县| 中方县| 宁乡县| 弋阳县| 泰和县| 应用必备| 广丰县| 盘山县| 措勤县| 光山县| 溧水县| 建水县| 长垣县| 陇南市| 抚州市| 汉中市| 通化县| 始兴县| 股票| 阳信县| 锡林郭勒盟| 贡山| 高淳县| 南京市| 宜州市| 湟中县| 滦南县| 梅河口市| 惠州市|