<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                低端控制器對執行效率要求很高,成本敏感,因而SoC內置SRAM是緊缺資源。代碼分塊管理就是為了充分利用內存,提高內存的復用效率而提出的一種設計方法。代碼分塊管理不僅涉及到硬件,同樣對操作系統和應用、驅動的設計都有要求,這些模塊共同努力以使執行效率達到最高。 本節講述代碼分塊(Bank)管理思想下可執行文件的重構,即對程序編譯后的可執行文件進行重新組織、打包,以在加載階段獲得最高的執行效率,減少內存占用。要使執行效率高,意味著可執行文件的格式盡可能簡單,解析執行文件的流程簡單,相應地,解析過程代碼量少,即能夠減少內存的占用。 keil產生的Hex或者Bin,其實也是keil對axf調試文件進行抽取,重新打包生成。Hex和Bin可以通過燒寫器下載到flash。GCC工具鏈會生成可執行格式ELF,也可以離線對ELF格式內容進行抽取,重新打包生產Hex格式,并燒寫到flash中。本次講述的是可執行文件存儲在外存儲設備(card,nand flash,硬盤)中,在運行前由操作系統將其加載到內存再執行這種情況。 要對工具鏈生成的可執行文件(如ELF)進行重構,自然需要熟悉該執行文件的格式,如ELF,里面會包括文件頭,SECTION節,符號段,代碼段,數據段,還有調試信息等等。而程序的運行往往只需要其中較少的段信息。可執行文件就是要得到必要的段的信息和數據,將不必要的通通刪除,并且根據代碼分塊管理的特點進行自定義格式的編制。這里不再對ELF等標準執行文件進行分析(以后可能另寫文章),只描述重構后的目標格式,看看什么段信息和數據是操作系統必要要知道和獲取的。 1\. 文件頭 ? ? ? ? ? ? 1)格式標識符,如應用,驅動等 ? ? ? ? ? ? 2)版本號 ? ? ? ? ? ? 3)常駐代碼段在文件中偏移 ? ? ? ? ? ? 4)常駐代碼長度 ? ? ? ? ? ? 5)常駐代碼段在內存中的起始地址? ? ? ? ? ?? ? ? ? ? ? ? 6)常駐數據(.DATA)段在文件中偏移 ? ? ? ? ? ? 7)常駐數據(.DATA)長度 ? ? ? ? ? ? 8)常駐數據段(.DATA)在內存中的起始地址 ? ? ? ? ? ? 9).bss段長度 ? ? ? ? ? ? 10).bss段在內存中的起始地址 ? ? ? ? ? ? 11)程序入口地址ENTRY:第一行代碼的地址,不是main哦,是運行時庫的一行代碼地址 ? ? ? ? ? ? 12)reserved,對齊到扇區或者1024字節。如果是驅動類型,則會增加兩個字段:驅動入口地址和驅動退出地址。? ? ? ? ? ? ? 2\. 代碼塊頭 ? ? ? ? ? ? ?1)第一個Bank組的頭,按順序是第一個Bank的塊信息、第二個Bank的塊信息、。。。第N個Bank的塊信息。一個Bank組最大含有N個Bank,不夠的填0. ? ? ? ? ? ? ?2)第二個Bank組的頭,按順序是第一個Bank的塊信息、第二個Bank的塊信息、。。。第N個Bank的塊信息。一個Bank組最大含有N個Bank,不夠的填0. ? ? ? ? ? ? ?..... ? ? ? ? ? ? ?有幾個Bank組由文件頭的格式標識符來判定,由架構師事先約定。 ? ? ? ? ? ? ?每個Bank塊的塊信息包括:bank塊數據(代碼和數據)在文件中的偏移,Bank長度,BAnk對應的內存地址。 3.常駐代碼段數據,對齊扇區 4.常駐數據段數據,對齊扇區 5.第一組Bank的數據,對齊扇區,只記錄真實的Bank數據,一個Bank組不夠N個bank時不需補0. 6.?第二組Bank的數據,對齊扇區,只記錄真實的Bank數據,一個Bank組不夠N個bank時不需補0. 7\. 最后一個組的Bank數據。 加載時解析該文件頭,獲得常駐代碼段和數據段的信息,將兩者加載到內存,對Bss段清0,然后讀取到程序的ENTRY入口,跳到該地址執行即可,簡單高效! Bank切換時,根據Bank組號和Bank號即快速定位到Bank的段信息地址,讀出該Bank在文件中的偏移和Bank長度,進而讀取并加載到復用的內存空間。???? 請關注SoC嵌入式軟件架構設計(控制器SoC固件架構)系列博文: [SoC嵌入式軟件架構設計之一:系統內存需求評估?](http://blog.csdn.net/yueqian_scut/article/details/24602941) [SoC嵌入式軟件架構設計之二:沒有MMU的CPU實現虛擬內存管理的設計方法](http://blog.csdn.net/yueqian_scut/article/details/24816757) [SoC嵌入式軟件架構設計之三:代碼分塊(Bank)設計原則](http://blog.csdn.net/yueqian_scut/article/details/24911021) [SoC嵌入式軟件架構設計之四:內存空間規劃分配](http://blog.csdn.net/yueqian_scut/article/details/24910877) [SoC嵌入式軟件架構設計之五:可執行程序的重構](http://blog.csdn.net/yueqian_scut/article/details/24910951) [嵌入式:節省內存的軟件設計技巧](http://blog.csdn.net/yueqian_scut/article/details/22522821) 更多嵌入式和物聯網原創技術分享敬請關注微信公眾號:嵌入式企鵝圈 ![](https://box.kancloud.cn/2016-01-13_5695f8f8d24b2.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看