国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于COFF和自舉表文件的DSP執(zhí)行程序提取器設(shè)計(jì)及實(shí)現(xiàn)

2021-11-16 14:44:22郝玉濤孫建祥安占新
航天控制 2021年3期
關(guān)鍵詞:格式文件執(zhí)行程序字節(jié)

郝玉濤 孫建祥 安占新

1.中國(guó)載人航天工程辦公室,北京 100071 2.北京航天自動(dòng)控制研究所,北京 100854

0 引言

2017年俄羅斯研制的 “聯(lián)盟-2.1B”火箭在東方港基地發(fā)射,由于飛行軟件使用的發(fā)射場(chǎng)坐標(biāo)參數(shù)是拜科努爾發(fā)射場(chǎng)的數(shù)據(jù),導(dǎo)致火箭未能進(jìn)入預(yù)定軌道,墜落大西洋[1]。由此可見(jiàn),飛行軟件正確與否關(guān)系到運(yùn)載火箭發(fā)射任務(wù)的成敗,確保飛行軟件執(zhí)行程序的正確性是航天型號(hào)軟件設(shè)計(jì)人員致力解決的重要問(wèn)題之一。

目前,航天控制領(lǐng)域廣泛使用德州儀器公司(Texas Instruments,簡(jiǎn)稱TI) DSP(Digital Signal Processors)處理器進(jìn)行控制計(jì)算。軟件設(shè)計(jì)人員通過(guò)集成開(kāi)發(fā)環(huán)境CCS(Code Composer Studio)或者CC(Code Composer)生成COFF(Common Object File Format,通用對(duì)象文件格式)格式的飛行軟件,再通過(guò)其配套的轉(zhuǎn)換工具,生成自舉表(Boot Table)格式的文件,固化在計(jì)算機(jī)的FLASH中。計(jì)算機(jī)上電后,通過(guò)自帶的bootloader引導(dǎo)程序,自動(dòng)加載自舉表格式的文件運(yùn)行[2]。自舉表格式的執(zhí)行程序能夠滿足運(yùn)載型號(hào)部分計(jì)算機(jī)上電自動(dòng)引導(dǎo)的需求,但不能滿足型號(hào)部分計(jì)算機(jī)需要通過(guò)二次引導(dǎo)程序[3-4]運(yùn)行的需求。自舉表格式的文件不僅包含DSP執(zhí)行程序,還帶有其它額外信息。二次引導(dǎo)的目標(biāo)文件(DSP執(zhí)行程序)不允許帶有這些額外信息。

為了滿足通過(guò)二次引導(dǎo)程序運(yùn)行的需求,需要生成二進(jìn)制格式的DSP執(zhí)行程序。以往,軟件設(shè)計(jì)人員主要采用2種人工提取方法:(1)通過(guò)集成開(kāi)發(fā)環(huán)境控制仿真器,將COFF格式的目標(biāo)文件下載到DSP處理器中,再按照MAP文件(用于表示程序、數(shù)據(jù)以及IO空間的映射)中的代碼段以及初始化數(shù)據(jù)段地址,提取相應(yīng)內(nèi)存中的執(zhí)行程序以及初始化數(shù)據(jù);(2)軟件設(shè)計(jì)人員人工分析COFF格式的文件,在文件中提取出代碼段以及初始化數(shù)據(jù)段。這兩種人工生成執(zhí)行程序的方法使用設(shè)備多,環(huán)境復(fù)雜,操作繁瑣,易出錯(cuò),可靠性低。

文獻(xiàn)[2]研究了DSP處理器引導(dǎo)功能的軟硬件配置設(shè)計(jì)以及引導(dǎo)控制程序;文獻(xiàn)[3]研究了基于二次引導(dǎo)程序的在線升級(jí)程序的方法;文獻(xiàn)[4]研究了多核DSP的加載方法和流程;文獻(xiàn)[5]研究了COFF文件向自舉表文件的轉(zhuǎn)換方法以及基于FLASH的自動(dòng)加載方法;文獻(xiàn)[6]研究了基于外部擴(kuò)展FLASH存儲(chǔ)器的程序代碼自舉加載方法。目前針對(duì)二次引導(dǎo)的目標(biāo)文件如何可靠提取,沒(méi)有相關(guān)文獻(xiàn)進(jìn)行論述。本文提出了基于COFF和自舉表(Boot Table)格式文件的DSP執(zhí)行程序提取器設(shè)計(jì)方案及實(shí)現(xiàn)技術(shù),不僅解決了文獻(xiàn)[2-6]中二次引導(dǎo)的目標(biāo)文件自動(dòng)提取問(wèn)題,提高了生成效率和正確率,而且通過(guò)加殼技術(shù)[7],在目標(biāo)文件中增加了DSP執(zhí)行程序的CRC校驗(yàn)信息,提高了飛行程序使用的可靠性。

本文研究了COFF文件、自舉表文件的格式,提出了基于上述兩種文件提取DSP執(zhí)行程序的算法,介紹了軟件實(shí)現(xiàn)技術(shù)、功能驗(yàn)證、性能評(píng)估以及在航天重大工程中的應(yīng)用情況。

1 COFF及自舉表文件簡(jiǎn)介

1.1 COFF文件

通用對(duì)象文件格式COFF是一種很流行的對(duì)象文件格式,是程序源代碼通過(guò)集成開(kāi)發(fā)環(huán)境進(jìn)行編譯、鏈接之后,最終產(chǎn)生的一種模塊化的文件格式。這種文件格式引入了“段”的機(jī)制,不同的目標(biāo)文件可以擁有不同數(shù)量以及不同類型的段,為軟件開(kāi)發(fā)人員提供了一組二進(jìn)制接口定義,這些接口可以延伸到多種操作環(huán)境,從而減少重新編碼、重新編譯程序的需要。

COFF文件包括文件頭、可選文件頭、段頭信息表、段數(shù)據(jù)、重定位信息、行號(hào)入口表、符號(hào)表、字符串表[5]。其中段頭信息表、段數(shù)據(jù)、重定位信息、行號(hào)入口表對(duì)應(yīng)多個(gè)段;文件頭、可選文件頭、段頭信息表、段數(shù)據(jù)與生成執(zhí)行程序密切相關(guān)。

文件頭用來(lái)保存COFF文件的基本信息,如段頭的數(shù)目、時(shí)間戳、符號(hào)表位置、屬性標(biāo)記等,共占用22字節(jié),其中第2、3字節(jié)指明了段頭的數(shù)目。

可選頭在文件頭后面,從COFF文件的0x16偏移處開(kāi)始,長(zhǎng)度為28個(gè)字節(jié),用來(lái)保存在文件頭中沒(méi)有描述到的信息,如執(zhí)行代碼的大小、初始化數(shù)據(jù)的大小、未初始化數(shù)據(jù)的大小、程序入口地址、執(zhí)行代碼的開(kāi)始地址、初始化數(shù)據(jù)的開(kāi)始地址等。

從第51字節(jié)開(kāi)始,為各段段頭信息表,用來(lái)描述段信息,每個(gè)段都有一個(gè)段頭信息表來(lái)描述,段的數(shù)目在文件頭中指出。每個(gè)段頭信息表共48個(gè)字節(jié),內(nèi)容包括段名、段數(shù)據(jù)載入內(nèi)存時(shí)的物理地址、段數(shù)據(jù)載入內(nèi)存時(shí)的虛擬地址、段數(shù)據(jù)的實(shí)際長(zhǎng)度、段數(shù)據(jù)在COFF文件中的偏移量、段屬性。第9~12字節(jié)為此段在內(nèi)存中的物理地址;第21~24字節(jié)為此段程序或者數(shù)據(jù)在COFF文件中的偏移地址;第41~44字節(jié)為段屬性。段屬性為0x00000020時(shí),表示此段是執(zhí)行代碼段;為0x00000040時(shí),表示此段是初始化數(shù)據(jù)段;為0x00000080時(shí),表示此段是未初始化的數(shù)據(jù)段。

段數(shù)據(jù)用來(lái)保存各個(gè)段的數(shù)據(jù),不同類型的段,其數(shù)據(jù)的內(nèi)容和結(jié)構(gòu)也不相同。在目標(biāo)文件中,這些數(shù)據(jù)都是原始數(shù)據(jù),無(wú)特別的格式。

1.2 自舉表文件

在DSP系統(tǒng)中通常使用FLASH存儲(chǔ)器保存程序,在上電或者復(fù)位時(shí),BootLoader引導(dǎo)程序?qū)⒋鎯?chǔ)在FLASH中的程序搬移到DSP片內(nèi)或者片外RAM中,并跳轉(zhuǎn)到用戶程序入口運(yùn)行,這個(gè)程序搬移過(guò)程叫自舉加載。用戶程序與一些必要的引導(dǎo)信息結(jié)合在一起,形成特定格式的自舉表,以便BootLoader引導(dǎo)程序在自舉加載過(guò)程中識(shí)別有效的用戶程序、搬移地址以及程序入口地址。

自舉表可以通過(guò)集成開(kāi)發(fā)環(huán)境提供的工具生成,其過(guò)程為:(1)使用hex.exe工具,將集成開(kāi)發(fā)環(huán)境生成的COFF格式文件轉(zhuǎn)換成為工具能夠識(shí)別的hex文件格式,轉(zhuǎn)換前需要配置好程序引導(dǎo)地址、程序入口地址;(2)使用hexbin.exe工具,將hex格式文件轉(zhuǎn)換為自舉表格式文件。

自舉表格式[6]文件包括內(nèi)存寬度、STRB控制寄存器數(shù)值、數(shù)據(jù)塊,其中數(shù)據(jù)塊可以有多個(gè),每個(gè)數(shù)據(jù)塊包括數(shù)據(jù)塊的大小、數(shù)據(jù)塊加載的起始地址以及數(shù)據(jù)。文件最后一個(gè)字?jǐn)?shù)值為0,表示文件結(jié)束。

2 算法設(shè)計(jì)

2.1 COFF文件解析算法

COFF文件解析器首先以二進(jìn)制形式讀入擴(kuò)展名為.out的COFF文件,分析COFF文件頭,其第2、3字節(jié)指明了段的數(shù)目;根據(jù)段數(shù)目,逐段分析段頭信息表,獲取每段的屬性標(biāo)識(shí),如果該段屬性為執(zhí)行代碼或者初始化數(shù)據(jù),記錄執(zhí)行代碼段、初始化數(shù)據(jù)段內(nèi)存中的物理地址、COFF文件中的偏移地址以及大??;計(jì)算執(zhí)行程序(包含初始化數(shù)據(jù))文件大?。挥?jì)算執(zhí)行代碼段、初始化數(shù)據(jù)段在執(zhí)行程序文件中的位置,按照線性映射關(guān)系將此段數(shù)據(jù)存儲(chǔ)在相應(yīng)內(nèi)存中。COFF文件解析算法工作流程如圖1所示。

圖1 COFF文件解析算法工作流程

詳細(xì)過(guò)程如下:

1)采用WIN32提供的內(nèi)存映射文件機(jī)制[8],根據(jù)可選頭中執(zhí)行代碼、初始化數(shù)據(jù)段的大小,在內(nèi)存中申請(qǐng)COFF文件相應(yīng)大小的地址空間區(qū)域,將COFF文件中的數(shù)據(jù)以二進(jìn)制形式讀入對(duì)應(yīng)的地址空間區(qū)域。解析過(guò)程中直接讀取內(nèi)存中相應(yīng)地址獲取COFF 文件數(shù)據(jù),不再對(duì)文件進(jìn)行IO操作。

2)針對(duì)內(nèi)存中的COFF文件數(shù)據(jù),分析其文件頭,確定段數(shù)目:N。

3)逐段分析段頭信息表,如果該段屬性為0x00000020時(shí),記錄此段內(nèi)存中的物理地址MemAddrText_i、大小LenText_i、文件中的偏移地址FileAddrText_i(i=1,2,3,……);如果該段屬性為0x00000040時(shí),記錄此段內(nèi)存中的物理地址MemAddrInitData_j、大小LenInitData_j、文件中的偏移地址FileAddrInitData_j(j=1,2,3,…….)。

4)計(jì)算執(zhí)行程序文件大小LenExeFile,并申請(qǐng)相應(yīng)大小的地址空間區(qū)域,用來(lái)與執(zhí)行程序、數(shù)據(jù)文件進(jìn)行線性映射:

AddrLow=Min(FileAddrText_i,MemAddrInitData_j)(i=1,2,3,……,j=1,2,3,…,Min表示求最小值)。

AddrHigh=Max(FileAddrText_i,MemAddrInitData_j)(i=1,2,3,……,j=1,2,3,…,Max表示求最大值)。

LenExeFile=AddrHigh-AddrLow+LenLast(LenLast為通過(guò)Max獲得的起始地址最大的段的長(zhǎng)度)。

5) 逐段分析段頭信息表,如果該段屬性為執(zhí)行代碼或者初始化數(shù)據(jù),計(jì)算此段數(shù)據(jù)在執(zhí)行程序文件中的位置,按照線性映射關(guān)系將此段數(shù)據(jù)存儲(chǔ)在相應(yīng)內(nèi)存中:MemAddrSec_k(k=1,2,3,……)為執(zhí)行代碼段或者初始化數(shù)據(jù)段內(nèi)存中的物理地址, 執(zhí)行代碼段或者初始化數(shù)據(jù)段在執(zhí)行程序文件中的位置:

ShiftAddrSec_k=MemAddrSec_k-AddrLow(k=1,2,3,……)。

6)完成所有段的分析之后,按照線性映射關(guān)系將內(nèi)存中的數(shù)據(jù)存儲(chǔ)在文件中,獲得執(zhí)行程序文件。

2.2 自舉表文件解析算法

自舉表文件解析器首先以二進(jìn)制形式讀入自舉表文件,逐一分析各數(shù)據(jù)塊,獲取各數(shù)據(jù)塊的大小,據(jù)此計(jì)算執(zhí)行程序文件的大小,并申請(qǐng)相應(yīng)內(nèi)存空間;根據(jù)各數(shù)據(jù)塊的大小、數(shù)據(jù)塊加載的起始地址,計(jì)算此段數(shù)據(jù)在執(zhí)行程序文件中的位置,并將數(shù)據(jù)塊的數(shù)據(jù)按照計(jì)算的位置存儲(chǔ)在內(nèi)存空間;將內(nèi)存空間中的數(shù)據(jù)最終存儲(chǔ)在執(zhí)行程序文件中。自舉表文件解析算法工作流程如圖2所示。

圖2 自舉表文件解析算法工作流程

詳細(xì)過(guò)程如下:

1) 讀入自舉表文件,獲取各段數(shù)據(jù)的大小LenSec_i(i=1,2,3,……),計(jì)算執(zhí)行程序文件映射內(nèi)存大小∑LenSec_i(i=1,2,3,……),申請(qǐng)相應(yīng)空間,并清零。

2)重新讀取自舉表文件,跳過(guò)內(nèi)存寬度和寄存器數(shù)值,指向第一個(gè)數(shù)據(jù)塊的信息頭,針對(duì)每一數(shù)據(jù)塊逐一進(jìn)行3)~6)的處理。

3)判斷自舉表文件當(dāng)前內(nèi)容是否為0,為0,表示自舉文件結(jié)束,否則,表示仍有數(shù)據(jù)塊需要處理。

4)依次獲取本段數(shù)據(jù)塊的大小以及起始地址。

5)計(jì)算本段數(shù)據(jù)在執(zhí)行程序文件映射內(nèi)存中的相應(yīng)位置,并將數(shù)據(jù)存儲(chǔ)在相應(yīng)位置的內(nèi)存中。

6)如果自舉表文件結(jié)束,則將內(nèi)存中的數(shù)據(jù)存儲(chǔ)在執(zhí)行程序文件中。

自舉表文件解析算法也采用WIN32提供的內(nèi)存映射文件機(jī)制,其操作過(guò)程和方法與COFF文件解析算法相同。

3 軟件實(shí)現(xiàn)與驗(yàn)證

3.1 軟件實(shí)現(xiàn)過(guò)程

本文以TI公司DSP為例進(jìn)行說(shuō)明,將集成開(kāi)發(fā)環(huán)境CCS或者CC編譯、鏈接生成的COFF文件作為輸入文件,經(jīng)過(guò)COFF文件解析器解析,生成執(zhí)行程序;使用集成開(kāi)發(fā)環(huán)境提供的hex.exe工具以及hexbin.exe工具,由COFF文件生成自舉表格式文件;自舉表格式文件經(jīng)過(guò)其解析器解析,生成執(zhí)行程序;為了提高生成執(zhí)行程序的可靠性,對(duì)由COFF格式和自舉表格式文件生成的執(zhí)行程序,通過(guò)二進(jìn)制比較器進(jìn)行逐字節(jié)比對(duì),兩套執(zhí)行程序大小、內(nèi)容完全一致,則認(rèn)為提取正確;最后通過(guò)二進(jìn)制文件編輯器,使用加殼技術(shù)[7],在執(zhí)行程序頭部增加長(zhǎng)度和CRC校驗(yàn)信息,生成帶CRC校驗(yàn)信息的執(zhí)行程序文件。軟件實(shí)現(xiàn)過(guò)程如圖3所。

圖3 軟件實(shí)現(xiàn)過(guò)程

在使用帶CRC校驗(yàn)信息的執(zhí)行程序文件前,可以根據(jù)長(zhǎng)度、CRC校驗(yàn)碼確認(rèn)文件的完整性和正確性;使用時(shí),通過(guò)脫殼技術(shù)[9],刪除CRC校驗(yàn)信息和文件長(zhǎng)度。帶CRC校驗(yàn)信息的執(zhí)行程序文件結(jié)構(gòu)如圖4所示。

圖4 帶CRC校驗(yàn)信息的執(zhí)行程序文件結(jié)構(gòu)

0~3字節(jié),存放執(zhí)行程序的長(zhǎng)度(以字節(jié)為單位);4~5字節(jié),填充0;6~7字節(jié),存放執(zhí)行程序的16位CRC校驗(yàn)碼,計(jì)算CRC校驗(yàn)碼的多項(xiàng)式為X16+X15+X2+1;從第8個(gè)字節(jié)開(kāi)始,依次存放執(zhí)行程序。

3.2 功能驗(yàn)證

COFF目標(biāo)文件包含text段、data段、bss段、const段、cinit段、switch段、stack段、system段、far段、sect指令定義的初始化段、usect指令定義的未初始化段等。這些段的含義如表1所示。其中text段、const段、cinit段、switch段以及sect指令定義的段為初始化段,需要提取到執(zhí)行程序文件。

表1 COFF文件段的組成

在對(duì)提取器進(jìn)行驗(yàn)證時(shí),測(cè)試用例考略了COFF文件的完整性、應(yīng)用程序工程中鏈接文件定義段的隨機(jī)性、提取器軟件防錯(cuò)處理等情況,共考慮10項(xiàng)內(nèi)容、117個(gè)組合情況,設(shè)計(jì)用例519個(gè)。詳細(xì)情況如表2所示。

表2 提取器測(cè)試內(nèi)容概況

3.3 性能評(píng)估

針對(duì)使用提取器生成執(zhí)行程序(以下簡(jiǎn)稱方式一)、使用集成開(kāi)發(fā)環(huán)境通過(guò)仿真器提取執(zhí)行程序(以下簡(jiǎn)稱方式二)、人工分析COFF文件提取執(zhí)行程序,設(shè)計(jì)人員進(jìn)行了生成正確率和性能對(duì)比分析。

在載人航天工程、探月工程、探火工程的新一代運(yùn)載火箭型號(hào)的分系統(tǒng)綜合試驗(yàn)、匹配試驗(yàn)、出廠測(cè)試、靶場(chǎng)測(cè)試以及發(fā)射任務(wù)過(guò)程中,隨機(jī)選擇了80KByte~300KByte大小的執(zhí)行程序、23位設(shè)計(jì)人員,初始化段和未初始化段隨機(jī)分配,每種狀態(tài)分別使用3種方式生成,每種方式均進(jìn)行了200次,一次正確率(以往人工生成時(shí),通過(guò)多次生成避免生成錯(cuò)誤)測(cè)試結(jié)果如表3所示。

表3 一次正確率測(cè)試結(jié)果

上述測(cè)試過(guò)程中,記錄三種方式每次均提取正確的時(shí)間,隨機(jī)選擇100次的測(cè)試結(jié)果進(jìn)行分析,如表4所示。

表4 性能測(cè)試結(jié)果

性能評(píng)估測(cè)試結(jié)果表明,通過(guò)提取器生成執(zhí)行程序,不僅能夠確保100%正確生成,提高了生成正確率,而且將生成效率提高了約20倍。

4 結(jié)論

以往人工生成DSP執(zhí)行程序的方法使用設(shè)備多,環(huán)境復(fù)雜,操作繁瑣,易出錯(cuò),可靠性低。本文提出了基于COFF和自舉表文件的DSP執(zhí)行程序提取器設(shè)計(jì)及實(shí)現(xiàn)技術(shù),并在載人航天工程、探月工程、探火工程的新一代運(yùn)載火箭型號(hào)中進(jìn)行了廣泛應(yīng)用。通過(guò)功能驗(yàn)證、性能評(píng)估以及型號(hào)應(yīng)用實(shí)踐,結(jié)果表明,使用提取器,能夠快速、自動(dòng)生成帶有CRC校驗(yàn)信息的DSP執(zhí)行程序,該技術(shù)極大提高了DSP執(zhí)行程序的生成效率、正確率、可靠性和使用安全性。

猜你喜歡
格式文件執(zhí)行程序字節(jié)
No.8 字節(jié)跳動(dòng)將推出獨(dú)立出口電商APP
執(zhí)行程序中的法律問(wèn)題與律師的作用
法制博覽(2019年27期)2019-12-13 23:37:40
使用“格式文件”將徠卡儀器數(shù)據(jù)導(dǎo)出成cass 格式的方法
No.10 “字節(jié)跳動(dòng)手機(jī)”要來(lái)了?
簡(jiǎn)談MC7字節(jié)碼
國(guó)有劃撥土地使用權(quán)強(qiáng)制執(zhí)行問(wèn)題研究
執(zhí)行程序與破產(chǎn)程序銜接機(jī)制若干問(wèn)題分析
法制博覽(2016年11期)2016-11-14 10:45:46
編寫(xiě)徠卡TS02型全站儀格式文件的方法探索
淺析執(zhí)行程序中對(duì)法定抵銷權(quán)的審查
回歸基礎(chǔ) 到底什么是RAW格式文件?
武川县| 区。| 常德市| 平江县| 青冈县| 太原市| 日土县| 砀山县| 赤水市| 灵石县| 东方市| 桃园县| 鲁山县| 韩城市| 寿阳县| 常州市| 淮北市| 阳新县| 乐昌市| 井冈山市| 桐城市| 娄烦县| 永平县| 永福县| 北宁市| 鄂温| 全州县| 辽阳市| 元朗区| 筠连县| 浙江省| 黄石市| 合山市| 民乐县| 海阳市| 新宾| 大名县| 山西省| 柳林县| 长子县| 黔西|