999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

ARM Cortex—M0+機器碼文件分析方法

2017-07-25 07:19:59蔡伯峰蔣建武王宜懷
現代電子技術 2017年14期

蔡伯峰+蔣建武+王宜懷

摘 要: MCU深層次應用開發需要開發人員深入了解機器碼在MCU中的存儲和執行機制,但機器碼自身可讀性差、相互關系不清晰等特點決定了對其閱讀、查找、分析難度較大。針對這一情況,以采用ARM Cortex?M0+內核的KL25 MCU為藍本,根據工程編譯鏈接過程和鏈接腳本文件(.ld),分析機器碼文件的生成機制和組織結構。在此基礎上針對機器碼文件中的中斷向量表、初始化代碼、函數、常變量、FLASH配置域等主要內容,結合機器碼系列文件,給出了簡明快捷實用的分析方法,為嵌入式開發人員優化及動態更新程序和數據、設計機器碼下載軟件等提供支撐,對其他內核機器碼文件的分析有借鑒意義。

關鍵詞: ARM Cortex?M0+; 機器碼文件; KL25; 鏈接腳本

中圖分類號: TN918.2?34; TP311 文獻標識碼: A 文章編號: 1004?373X(2017)14?0044?05

Abstract: MCU deep?level application development requires its developers to understand storage and enforcement mechanisms of machine codes in MCU, but the machine code itself has poor readability and unclear structure, thus it is difficult to be directly read, searched and analyzed. In response to this situation, using the ARM Cortex?M0+ KL25 MCU as a model, and according to engineering compiling linking process and linker script files (.ld) of MCU application project, the generative mechanism and structure of machine code file are analyzed. On this basis, a concise, efficient and practical analysis method is given in allusion to the interrupt vector table, initialization code, functions, constants, variables and Flash configuration domain. This is helpful for the embedded developers to update dynamically and optimize programs and data, design machine code download software, and analyze machine code files of other kernels.

Keywords: ARM Cortex?M0+; machine?code file; KL25; linker script

0 引 言

用C語言開發的MCU應用工程經過編譯鏈接后生成機器碼目標文件,正確全面深入地掌握機器碼文件的分析方法是快速進行MCU深層次應用開發必備的技能。機器碼文件要通過機器碼下載軟件下載到目標板上芯片的FLASH存儲區中運行,下載軟件一般需要開發人員自行設計,因為KDS(Kinetis Design Studio)等集成開發環境提供的下載方法在脫離開發環境后無法使用,不便于產品的批量生產;而在程序正常運行后,有時需要動態在線更新或升級部分程序和數據,如濾波算法程序、排序算法程序、系統參數等;嵌入式系統的存儲資源與通用計算機系統相比,相對匱乏、速度較低,對實時性、可靠性要求較高[1],需要根據實際情況動態修改或優化程序和數據等。這一切都需要開發人員對機器碼文件有充分的了解,能正確深入地分析機器碼文件,了解程序數據的存儲和執行機制、芯片復位啟動過程、程序執行時間等芯片底層內容。但不同廠家不同內核的指令機器碼存在差異,應用工程的機器碼文件結構和組成也不相同,分析方法也不盡相同,目前有關ARM Cortex?M0+內核機器碼文件的系統性分析研究很少。機器碼自身可讀性差、相互關系不清晰、不符合通常思維習慣等特點決定了由其組成的機器碼文件閱讀、理解和分析困難,為此,要有正確實用的分析機制和分析方法。

本文在深入剖析機器碼文件的生成機制、組織結構的基礎上,結合機器碼系列文件,給出了簡明快捷的分析方法。

1 機器碼文件的生成

MCU應用工程在編譯鏈接工程中會使用一些文件,并生成若干文件,只有了解這些文件的生成過程、相互關系、功能作用等內容才能全面準確地分析機器碼文件。

1.1 MCU程序編譯鏈接過程

KDS集成開發環境下,對任一用C語言開發的MCU應用工程,運行Cross ARM GCC編譯器,會經過如圖1所示的編譯、匯編和鏈接等過程。

MCU應用工程往往包含若干源代碼文件(.c)(也包含需要快速執行的匯編程序.S),每個源代碼文件在編譯、匯編后都會生成一個可重定位的二進制目標文件(.o)[2](本文稱之為中間文件),再通過ld鏈接器根據鏈接腳本文件(.ld)的內部相關規則將這些中間文件鏈接組合成針對ARM CPU的.elf格式的可執行目標文件[3]。如果程序調用了靜態庫(.a)中的函數或變量,鏈接時還會包括相應的庫文件。在編譯鏈接過程中,還可同時生成機器碼文件(.hex)、映像文件(.map)、列表文件(.lst)。

1.2 鏈接腳本文件的使用

鏈接腳本文件(.ld)提供給鏈接器控制鏈接過程,用于重定位代碼并提供程序、數據在內存中的存儲位置[4?5]。它規定如何將各個中間文件中的段(稱為輸入段)放入可執行目標文件中合適的段(稱為輸出段)中,并控制目標文件內各部分的地址分配。它主要由MEMORY,SECTIONS命令組成[6]。首先通過MEMORY命令劃分FLASH和RAM存儲空間可用資源區為多個存儲區,并定義各存儲區的起始地址及長度、設置讀寫或執行等屬性。再通過SECTIONS命令定義一些可供應用程序使用的符號并賦值、包含在可執行目標文件中的各個輸出段及裝載到哪個存儲區。在各個輸出段中定義一些與該段相關的一些符號并賦值,同時確定該段應該由哪些中間文件的哪些輸入段如何鏈接而成。

以 KL25_UART應用工程為例,該工程運行于本課題組自行設計的基于KL25(NXP公司的MKL25Z128VLK4)的開發板上,用于測試串口與PC機間通信情況。KL25[7]包含128 KB FLASH,16 KB SRAM。FLASH分成128扇區,每扇區1 024 KB。MEMORY和SECTIONS命令所定義的各存儲區、包含的輸出段及存儲器空間分配情況如圖2所示。共定義4個存儲區:中斷向量區“m_interrupts”、FLASH配置區“m_flash_config”、用戶程序區“m_text”和數據區“m_text”。前3個區在FLASH(本文稱為目標FLASH)中,數據區在SRAM中。其中,“m_text”區中的.text段定義如下:

.text:

{ . = ALIGN(4); /*4 B的邊界對齊*/

*(.text) /*非函數代碼*/

*(.text.*) /*函數代碼*/

*(.rodata) /*字符串等*/

*(.rodata.*) /*數組常量等*/

} > m_text

鏈接腳本文件可由開發人員根據MCU應用工程的程序、數據所需空間大小及存放要求、鏈接要求等自行編寫或由開發環境生成后修改。

1.3 機器碼系列文件的生成

可執行目標文件(.elf)的生成依賴于鏈接腳本文件和各個中間文件。當源文件被編譯成中間文件時,其中的各輸入段并沒有具體地址,中間文件中只是記錄了程序中所使用的各個符號和各符號在輸入段中的相對位置。只有當鏈接器根據鏈接腳本文件鏈接中間文件的各個輸入段時,各段才會根據鏈接腳本文件中所分配的地址獲得加載內存地址LMA和虛擬內存地址VMA[8],各個符號也才有了真實地址。再根據每一符號所對應的真實地址更新相應的指令,從而實現真正的函數調用和符號引用功能。通過這一重定位過程就可生成可執行目標文件(.elf)。

因為可執行目標文件是二進制文件,包含程序開始執行地址、程序頭、輸出段頭、符號表、各個輸出段、重定位信息以及調試和說明信息等并需專門工具軟件打開,可讀性差、分析不便,不是本文分析研究的對象。本文所要分析的機器碼文件是指由可執行目標文件在KDS下經格式轉換而生成的機器碼文件(.hex)。它是由十六進制文本組成的ASCII碼文件,已經包含可執行目標文件中的程序入口地址、各個輸出段等主要內容,可讀性和結構清晰度均較好,分析比較方便。而可執行目標文件中的其他內容也已經包含在KDS下生成的列表文件(.lst)和映像文件(.map)中。

映像文件提供了鏈接腳本文件中所定義的各個符號的地址值和各個輸入輸出段的長度及LMA,VMA地址映射信息。列表文件提供了程序開始執行地址、程序頭、輸出段頭、符號表,以及“C代碼、匯編代碼、機器碼及存儲地址”的對應關系及LMA、常量數據等內容,用于程序分析。

2 機器碼文件組織結構分析

機器碼文件(.hex)存放了中斷向量表、FLASH配置域信息、程序機器碼、常量、初始化了的靜態變量和全局變量、程序入口地址等內容,可直接使用串行線調試(Serial Wire Debug,SWD)技術通過下載程序下載到目標MCU中運行,比通過USBDM外部調試接口下載.elf文件方便、快捷。

機器碼文件是由若干行符合Intel HEX文件格式的十六進制文本所構成的ASCII文本文件,文件每一行均是一條HEX記錄,記錄分成6種不同類型,但記錄格式均相同,如表1所示。

本文以KL25_UART應用工程的KL25_UART.hex為例進行分析,文件內容如圖3所示。記錄中的偏移量表示當前記錄中“數據/信息區”的有效數據在裝載到目標FLASH中時的偏移地址,也只有這些數據才會被裝載到目標FLASH中,它們在FLASH中以小端方式(KL25 MCU內部采用的存儲方式[4],即字的低字節存儲在低地址中)依次存放。

圖3中“數據/信息區”的內容簡要分析如下:

(1) 中斷向量表。存放于第1~12行的記錄中。KL25有48個中斷向量,每個中斷向量占4 B,每條記錄可存放4個中斷向量,共占用12條記錄。裝載到目標FLASH中時,中斷向量表將會從偏移地址是“0x0000”處開始存放,占用(4×12)×4=192 B。

(2) FLASH配置域。存放于第13行記錄中, 固定長度為16 B,在目標FLASH中的偏移地址是“0x0400”。

(3) 程序和常量。存放于第14~209行中,在目標FLASH中的偏移地址是“0x0800”。

(4) 靜態變量及全局變量。緊接著上述機器碼程序和常量后是已初始化為非0的靜態變量及全局變量,數據長度因應用工程而異。它們也會裝載到目標FLASH中,斷電后數據不會丟失。復位啟動時初始化程序會將它們拷貝到RAM中。

(5) 其他內容。機器碼文件倒數第2行固定為存放程序開始執行地址的記錄,記錄類型為“0x03”,最后一行固定為文件結束記錄,記錄類型為“0x01”。

3 機器碼文件內容分析

雖然機器碼文件本身提供的信息量有限,但結合.ld,.lst、,map等系列文件提供的編譯鏈接和裝載等信息,就可以全面分析該文件,以深入了解中斷向量表、芯片復位啟動過程、FLASH加密解密機制、代碼及數據的鏈接方法、定位、裝載和運行地址、空間占用情況、執行時間、符號的處理等內容。

3.1 中斷向量表定位與分析

中斷向量表位于機器碼文件的開始處,將直接裝載到目標FLASH的0x00000000地址處。因為根據芯片內部工作機制,中斷向量表應存放于目標FLASH的0x00000000地址處即第0扇區,當MCU上電啟動或復位時,將從該處取出4 B的第一表項內容賦給堆棧指針SP,完成堆棧指針初始化工作,取出4 B的第二表項內容賦給程序計數器PC,以便轉到相應地址處執行芯片復位處理代碼。中斷向量表占用的空間依賴于具體MCU的中斷源數量,就目前市場上的MCU而言,最多占用1個扇區,在扇區大小是1 024 KB的情況下,1個扇區可以存放=256個中斷向量,即使扇區大小是512 KB也可以存放128個中斷向量。

中斷向量表中各個中斷向量對應的是符號值、0(表示未用)或中斷處理函數名或弱函數名,在編譯鏈接并重定位時,鏈接器會將這些符號、函數名、弱函數名更新為相應的符號值、函數、弱函數或對應的強函數的虛擬內存地址VMA(即運行地址)。

中斷向量表一般在芯片啟動文件(.s)中定義,啟動文件的內容結構[9]如圖4所示。

在KL25芯片啟動文件定義的中斷向量表中,序號為0的中斷向量是__StackTop(棧頂地址符號),序號為1的中斷向量是Reset_Handler(芯片復位處理函數),序號為29的中斷向量是UART1_IRQHandler弱函數,并在中斷處理源文件中定義了對應的強函數。圖3中序號為0的中斷向量4字節組“00 30 00 20”實際表示的數據是“20 00 30 00”,正是_StackTop的值。序號為1的中斷向量4字節組“01 08 00 00”→“00 00 08 01”,其內容減1后的值正是Reset_Handler函數的VMA,也是程序開始執行地址。內容減1是因為KL25的Cortex?M0+處理器的指令地址為半字對齊,即PC寄存器的最低位必須始終為0,但程序在跳轉時,PC的最低位必須被置為1,以表明內核處于執行16位Thumb指令的Thumb狀態,而非執行32位指令的ARM狀態[10]。序號為29的中斷向量4字節組“ED 08 00 00”→“00 00 08 ED”,其內容減1后的值正是UART1_IRQHandler強函數的VMA。從KL25_UART.map或intflash.ld文件中可以查到_StackTop和Reset_Handler,UART1_IRQHandler等函數的VMA正是這些值。

進而根據中斷處理函數的VMA就可在機器碼文件中相應的偏移地址(=中斷處理函數的VMA-0x00000000)處查找到其機器碼。

3.2 FLASH配置域定位與分析

FLASH配置域在機器碼文件中緊接著中斷向量表后存放,記錄中的偏移量對應的是目標FLASH第一扇區的開始地址。由于FLASH保護和加解密功能需擦除整個第一扇區,所以該扇區剩余的空間保留著,當不用FLASH保護和加解密功能時可以存放機器碼數據。

FLASH配置域保存了默認的FLASH保護設定及加密屬性,用于對FLASH模塊進行訪問控制,以防止某些FLASH存儲區域受意外擦除、寫入,或通過外部調試接口(如JTAG,SWD和USBDM等)訪問FLASH存儲器,但加密后通過外部調試接口仍可進行大規模的擦除操作,只是無法執行讀取或寫入FLASH的指令。在芯片復位時,FLASH模塊讀取FLASH配置域相應字段信息對FLASH保護寄存器FPROT 和加密寄存器FSEC進行初始化。FLASH配置域信息如表2所示,相關寄存器內容可見文獻[7]。

開發者可直接對FLASH配置域字段進行改寫(先擦除整個扇區,再復位芯片后寫入)以啟用/關閉加密功能,或使用封裝的加密解密函數來對配置域進行設置,但前者操作簡單直接且更為安全。

3.3 MCU初始化代碼定位與分析

MCU應用程序機器碼區包括芯片初始化代碼、各個函數代碼、常量、初始化為非0的靜態和全局變量等,位于機器碼文件中緊接著FLASH配置域后,首條記錄中的偏移量對應的是目標FLASH第二扇區的開始地址。應用工程不同,記錄條數和機器碼長度也不相同。由于中斷向量表第二表項存放的是MCU初始化函數Reset_Handler的VMA,所以只要計算出偏移地址(=Reset_Handler函數的VMA-0x00000000),就可方便地在機器碼文件中查找到Reset_Handler函數的機器碼。圖3中Reset_Handler函數的機器碼從記錄中偏移量是0x0800處(第14行記錄)開始存放。通過查看KL25_UART.lst文件可知,該處的機器碼“72 B6 00 F0…”→“B6 72 F0 00…”對應的是芯片啟動文件的Reset_Handler函數,共占0x44 B,初始化過程見圖4。弄清MCU初始化過程后,在實際應用中,就可根據是否要啟動看門狗、是否要復制中斷向量表至RAM、是否要清零未初始化.bss段、啟動時間、是否添加監控程序等要求來編寫或修改、優化相關代碼,以提高系統的穩定性、可靠性、靈活性。監控程序可添加在進入main函數之前的位置處,以判斷是否有要寫入機器碼到FLASH中的命令,若有則完成寫入,這是更新用戶程序的一種簡便方法。

3.4 函數和功能段的定位與分析

在C函數代碼編譯成匯編指令時,編譯器自動在函數開始處添加push指令以保存函數被調用時的現場,如push{r7, lr},函數結束處自動添加pop指令以恢復現場,如pop{r7, pc}。其機器碼高位字節分別為B5,BD,低位字節與指令中使用的寄存器相關,在存儲時機器碼是半字對齊并采用小端格式。這樣就可根據B5,BD來定位函數。

(1) 用戶函數及ISR的定位。若某一存儲單元的內容為“B5”且其偏移地址的最低位為1,則從該存儲單元的上一單元開始表示某個函數開始。其后第一個“BD”所在的存儲單元(其偏移地址的最低位必須為1)表示該函數結束。找出函數機器碼后就可直接計算其占用的存儲空間字節數,更加便捷的方法是查詢.lst文件中的符號表。

(2) 某個特定函數的定位。由于機器碼文件中沒有函數名,所以要定位特定名稱的某個函數需要借助于.lst文件進行,即根據.lst文件中提供的“C代碼、匯編代碼、機器碼及存儲地址”部分的內容,找到該函數的前幾個機器碼字節,從而就可在機器碼文件中定位到函數的開始部分。

(3) 相鄰存儲的兩函數之間的數據歸屬。如果函數中使用了字符串常數、數組常量、靜態和全局變量等數據,那么它們的VMA地址將會存放到該函數最后。函數中的指令先通過相對尋址方式,從PC值與指令中給出的偏移量相加后形成的操作數地址所指向的存儲單元中取出VMA地址,再通過獲得的VMA地址訪問到所需數據。其余常量直接轉換成指令中的立即數存放于機器碼中。

(4) 功能段的定位。特定的C語言功能段代碼對應的機器碼可以直接在.lst文件中查找到,據此就可在機器碼文件中定位,并可很方便地計算其占用的存儲空間字節數。計算執行時間時可根據對應的匯編指令及內核參考手冊上提供的指令執行周期進行精確計算[11]。

定位到函數或功能段后就可修改其代碼,或動態在線更新目標FLASH中的相應代碼。要實現動態更新功能,可以在編程時在main的永久循環中添加監控代碼,以判斷是否有要寫入機器碼到FLASH中的命令,若有則完成寫入。

3.5 常量、靜態和全局變量的定位與分析

字符串常數、數組常量等在機器碼文件中的存放位置取決于.ld文件中對.text段的定義,在本文中,它們集中存放于機器碼的后面,而其余常量將其值以立即數形式直接存放于指令中。要確定某個特定常量的存放位置,可從.lst文件的最后內容中先查找到該常量的存放地址,再到機器碼文件中精確定位。

根據鏈接腳本文件,未初始化或初始化為0的靜態和全局變量存放于RAM中.data段后的.bss內存區域中,但.bss段不占機器碼文件空間和目標FLASH空間,只占運行時的RAM空間。而.data段中包含的初始化為非0的靜態和全局變量占用機器碼文件空間、目標FLASH空間和運行時的RAM空間,斷電后初始化數據能保存。

在機器碼文件中,初始化為非0的靜態和全局變量緊接著機器碼和常量的后面存放。從.lst文件中可以查看到它們的LMA和占用空間,據此可在機器碼文件中精確定位到特定的變量,并可計算出FLASH剩余空間的起始地址。定位到常量、靜態和全局變量后,可根據需要修改其值或通過監控程序動態在線更新目標FLASH中的相應值。FLASH剩余空間可用于存放其他數據,如系統參數等,同樣可實現動態在線更新。

4 結 語

本文在對ARM Cortex?M0+機器碼文件的生成機制、組織結構和內容進行深入剖析的基礎上,結合機器碼系列文件提供的信息,系統地給出了中斷向量表、FLASH配置域、初始化代碼、函數和常量、全局或靜態變量等內容在機器碼文件中的定位與分析方法,使得對機器碼文件的分析變得簡明快捷。開發人員可以將分析結果應用于MCU深層次應用開發工作中,如編寫或修改鏈接腳本文件及芯片復位啟動程序、精確計算代碼執行時間和占用的存儲空間、添加監控代碼、優化及動態更新程序和數據、設計機器碼下載軟件等,以充分利用MCU有限的資源,提高系統的可靠性、穩定性、健壯性。

參考文獻

[1] 廉玉龍,史崢,李春強,等.基于C.SKY CPU的地址立即數編譯優化方法[J].計算機工程,2016,42(1):46?50.

[2] 胡宗棠,王宜懷,沈忱.面向MC1321X的低開銷無線重編程機制的研究與設計[J].計算機應用與軟件,2014,31(12):272?277.

[3] 王宜懷,朱仕浪,郭蕓.嵌入式技術基礎與實踐[M].3版.北京:清華大學出版社,2013:86?87.

[4] STANKIC M, CETIC N, KRNJETIN M, et al. Graphical tool for generating linker configuration files in embedded systems [C]// Proceedings of 2011 19th Telecommunications Forum. [S.l.: s.n.], 2011: 1550?1553.

[5] ARM. Armlink user guide [DB/OL]. (2016?03?31) [2016?05?15]. http://infocenter.arm.com/help/.

[6] Free Software Foundation. Documentation for binutils 2.26 [DB/OL]. (2016?01?25) [2016?05?15]. https://sourceware.org/binutils/docs?2.26/ld/.

[7] NXP. KL25 Sub?family reference manual [DB/OL]. (2014?09?01) [2016?05?15]. http://www.nxp.com/.

[8] 胡敏,盧永江,劉兵.基于CK810處理器的匯編鏈接時優化[J].計算機工程,2014,40(11):250?254.

[9] NXP. Kinetis assembler reference manual [DB/OL]. (2014?02?01) [2016?05?15]. http://www.nxp.com/.

[10] JOESEP Yiu.ARM?Cortex?M0權威指南[M].吳常玉,譯.北京:清華大學出版社,2013:52?53.

[11] ARM. Cortex?M0+ Processor technical reference manual [DB/OL]. (2012?12?16) [2016?05?15]. http://infocenter.arm.

主站蜘蛛池模板: 精品久久久久久久久久久| AV不卡在线永久免费观看| 国产自在线播放| 99er这里只有精品| 久久情精品国产品免费| 欧美日韩在线成人| 青青青亚洲精品国产| 中文字幕2区| 成年女人a毛片免费视频| 内射人妻无码色AV天堂| 另类欧美日韩| 伊人久久福利中文字幕| 色综合五月婷婷| 国产噜噜在线视频观看| 亚洲系列无码专区偷窥无码| 亚洲国产欧美国产综合久久 | 天天综合亚洲| аⅴ资源中文在线天堂| 精品欧美视频| 国产极品美女在线| 亚洲区一区| 国产成+人+综合+亚洲欧美| 伊人久久大香线蕉综合影视| 欧洲高清无码在线| 男女性午夜福利网站| 国产成人精品在线1区| 国产丝袜丝视频在线观看| 色窝窝免费一区二区三区 | 欧美五月婷婷| 欧美成人午夜影院| 在线无码av一区二区三区| 91啦中文字幕| 亚洲高清中文字幕在线看不卡| 毛片免费高清免费| 福利在线一区| 日韩成人午夜| 久久精品中文字幕少妇| 自拍中文字幕| 国产一级毛片网站| 国产簧片免费在线播放| 日韩无码一二三区| 亚洲精品第一页不卡| 91久久国产热精品免费| 中文字幕亚洲综久久2021| 国产乱人视频免费观看| 青青热久免费精品视频6| 99热这里只有精品免费国产| 五月天在线网站| 日本人妻丰满熟妇区| 亚洲乱码在线播放| 少妇精品在线| 国产视频a| 亚洲伊人天堂| 久久黄色毛片| 久久精品娱乐亚洲领先| 啪啪国产视频| 2021国产在线视频| 亚洲第一极品精品无码| 91原创视频在线| 亚洲精品国偷自产在线91正片| 一本大道AV人久久综合| 国产成人凹凸视频在线| 青青久在线视频免费观看| 日韩A级毛片一区二区三区| 国产无码精品在线| 中文字幕无线码一区| 91欧美在线| 欧美性猛交一区二区三区| 青草视频免费在线观看| 国产小视频网站| 免费看a级毛片| 国产成在线观看免费视频| 亚洲午夜福利精品无码不卡 | 中文字幕66页| 亚洲第一视频网| 日韩精品专区免费无码aⅴ| 91九色国产在线| 日日拍夜夜嗷嗷叫国产| 欧美中文字幕在线二区| 国产肉感大码AV无码| 欧美亚洲一区二区三区导航| 亚洲日产2021三区在线|