亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種無操作系統(tǒng)下SOC軟件增量升級(jí)方法

        2016-09-14 09:17:42武柯安李庭勝吳傳偉
        電子設(shè)計(jì)工程 2016年2期
        關(guān)鍵詞:符號(hào)

        武柯安,李庭勝,吳傳偉

        (中國電子科技集團(tuán)公司第三十研究所 四川 成都 610041)

        一種無操作系統(tǒng)下SOC軟件增量升級(jí)方法

        武柯安,李庭勝,吳傳偉

        (中國電子科技集團(tuán)公司第三十研究所 四川 成都610041)

        無操作系統(tǒng)下,SOC的軟件升級(jí)一般采用整體替換的方式,無法獨(dú)立升級(jí)特定的軟件模塊。通過深入分析SOC目標(biāo)代碼結(jié)構(gòu)以及目標(biāo)代碼間的鏈接機(jī)制,提出了一種軟件增量升級(jí)的方法。首先,開發(fā)者獨(dú)立編譯待升級(jí)模塊并按照一定的格式修改其目標(biāo)文件,生成升級(jí)數(shù)據(jù)包。之后,SOC接收該數(shù)據(jù)包,根據(jù)協(xié)議規(guī)范,加載并修改相關(guān)指令,完成最終的升級(jí)工作。經(jīng)實(shí)驗(yàn)驗(yàn)證分析,方案可有效地實(shí)現(xiàn)無操作系統(tǒng)下SOC軟件模塊的增量升級(jí)。

        嵌入式系統(tǒng);增量升級(jí);動(dòng)態(tài)鏈接;地址無關(guān)編碼

        無操作系統(tǒng)下的嵌入式處理器一般通過整體替換原代碼以實(shí)現(xiàn)軟件升級(jí)維護(hù)[1]。由于沒有操作系統(tǒng)的支撐,SOC上的軟件模塊無法通過更換動(dòng)態(tài)鏈接庫的方式獨(dú)立升級(jí)。因此,即使對(duì)原始版本的軟件只進(jìn)行了很小的改動(dòng),開發(fā)端也必須重新編譯整個(gè)工程。為此,文中通過深入分析SOC目標(biāo)代碼結(jié)構(gòu)以及目標(biāo)代碼間的鏈接機(jī)制,提出了一種針對(duì)軟件模塊進(jìn)行增量升級(jí)的新技術(shù)。與傳統(tǒng)的整體升級(jí)技術(shù)相比,這種增量升級(jí)技術(shù)具有以下幾方面的優(yōu)點(diǎn):

        1)設(shè)備升級(jí)過程對(duì)用戶完全透明,用戶只需接收設(shè)備維護(hù)人員遠(yuǎn)程分發(fā)的升級(jí)數(shù)據(jù)包即可,顯著降低了設(shè)備升級(jí)維護(hù)難度;

        2)在一定程度上實(shí)現(xiàn)了上層功能軟件與底層硬件無關(guān),提高了代碼的可重用性;

        3)可有效減小升級(jí)數(shù)據(jù)包的大小,從而降低了對(duì)信道資源的開銷,提高了較低信道帶寬下的升級(jí)效率和一次成功率;

        文中實(shí)驗(yàn)中采用的處理器為某國產(chǎn)SOC,其CPU為32 位RSIC內(nèi)核CK520,編譯器兼容gcc 4.5.1版本。對(duì)于開發(fā)環(huán)境兼容GNU工具鏈的大部分處理器而言,本文提出的技術(shù)手段均適用。

        1 可執(zhí)行代碼的鏈接機(jī)制

        程序編譯通常包括預(yù)處理、編譯、匯編和鏈接4個(gè)步驟。編譯器根據(jù)語法規(guī)則以及處理器的指令集,將每個(gè)源代碼文件編譯成對(duì)應(yīng)的目標(biāo)文件。鏈接器對(duì)這些目標(biāo)文件中的符號(hào)進(jìn)行重定位,將幾個(gè)獨(dú)立的目標(biāo)文件鏈接為最終的可執(zhí)行文件。鏈接分為靜態(tài)鏈接和動(dòng)態(tài)鏈接兩種。靜態(tài)鏈接由編譯工具在編譯過程中完成。動(dòng)態(tài)鏈接則由操作系統(tǒng)在程序運(yùn)行過程中完成[2]。

        文中提出的一種基于軟件模塊動(dòng)態(tài)加載模型的SOC增量升級(jí)技術(shù)綜合使用了靜態(tài)鏈接和動(dòng)態(tài)鏈接技術(shù),從而有效避免了僅升級(jí)部分軟件時(shí)對(duì)整機(jī)軟件的整體替換。

        1.1靜態(tài)鏈接

        目標(biāo)文件一般按照可執(zhí)行鏈接格式 (Executable and Linking Format,ELF)進(jìn)行格式化存儲(chǔ)[4]。ELF文件起始處為大小固定的ELF Header,該字段給出了節(jié)頭表(Section Header Table)相對(duì)文件起始處的偏移地址。而節(jié)頭表中則以結(jié)構(gòu)體數(shù)組的形式存儲(chǔ)了ELF文件中所有段的信息,包括段名稱、段類型、段的偏移地址等。在所有段中,一個(gè)比較重要的段是“.symtab段”。該段保存了模塊中所有符號(hào)的信息,包括符號(hào)名、符號(hào)類型、符號(hào)相對(duì)段起始位置的偏移等。對(duì)于可被靜態(tài)鏈接的目標(biāo)文件而言,還有一類以.rela為前綴的重定位段,如“.rela.text段”、“.rela.data段”等。這些段存儲(chǔ)了目標(biāo)文件中所有符號(hào)的重定位信息,包括符號(hào)名、符號(hào)類型、符號(hào)重定位入口(即該目標(biāo)文件在此位置引用了需重定位的符號(hào))。ELF文件結(jié)構(gòu)如下圖所示。

        圖1 ELF文件的存儲(chǔ)結(jié)構(gòu)Fig.1 The structure of ELF files

        匯編完成后,各目標(biāo)文件中所有被引用的外部全局符號(hào)的地址均被置為虛地址。靜態(tài)鏈接時(shí),鏈接器將所有目標(biāo)文件的相似段進(jìn)行合并,同時(shí)分配加載存儲(chǔ)地址(Load Memory Address,LMA)和虛擬存儲(chǔ)地址 (Virtual Memory Address,VMA)即代碼在SRAM中的加載地址[3]。此時(shí),所有全局符號(hào)在程序運(yùn)行時(shí)的地址均已確定。之后,鏈接器根據(jù)各目標(biāo)文件的“.rela.text”、“.rela.data”等重定位段獲取重定位入口,再根據(jù)“.symtab段”調(diào)整重定位入口處的相關(guān)指令即可完成各符號(hào)的重定位,從而實(shí)現(xiàn)各目標(biāo)文件的靜態(tài)鏈接。

        1.2動(dòng)態(tài)鏈接

        動(dòng)態(tài)鏈接的模塊可能被加載到任意位置。編譯時(shí)鏈接器無法確定模塊中各符號(hào)的VMA。因此,動(dòng)態(tài)鏈接一般延遲到模塊被加載時(shí)才執(zhí)行。

        動(dòng)態(tài)鏈接模塊一般采用地址無關(guān)編碼(Positionindependent Code,PIC)技術(shù)。PIC的代碼中,對(duì)目標(biāo)符號(hào)的訪問包括以下兩種情形:

        1)訪問模塊內(nèi)定義的符號(hào)

        以CK520的匯編指令集為例,程序先通過如下指令獲取“.got段”地址:

        其中 bsr指令將下一條指令(即指令 next:lrw r14,offset1)的VMA傳給r15。offset1為當(dāng)前指令相對(duì)“.got段”的偏移量,其值在模塊編譯時(shí)已確定。然后程序再通過如下指令,將目標(biāo)符號(hào)的絕對(duì)地址存入r7:

        其中offset2為目標(biāo)符號(hào)相對(duì)“.got段”的偏移量,編譯時(shí)offset2的值也已確定。這樣,不論該模塊被加載到何位置,目標(biāo)符號(hào)的地址總能被計(jì)算出來并存入r7。顯然,模塊內(nèi)定義的符號(hào)的尋址代碼與模塊的加載地址無關(guān)。

        2)訪問模塊外定義的符號(hào)

        如圖2所示,訪問模塊外定義的符號(hào)時(shí)采用了間接尋址的方式。

        圖2 模塊間符號(hào)的尋址方式Fig.2 Addressing method for symbols between modules

        以模塊2訪問模塊1中定義的符號(hào)func1為例,相應(yīng)的匯編指令如下:

        首先通過“PC指針+offset1”獲取“.got段”的地址。“.got段”中存放了所有外部符號(hào)的指針。模塊被加載時(shí),動(dòng)態(tài)鏈接器自動(dòng)更新“.got段”,以確保每個(gè)指針?biāo)赶虻牡刂范颊_。通過 offset2即可獲取目標(biāo)符號(hào)的指針。同樣的,編譯時(shí)offset1和offset2的值已確定。

        可動(dòng)態(tài)鏈接的目標(biāo)文件也采用ELF格式對(duì)各個(gè)段進(jìn)行格式化存儲(chǔ)[5]。兩個(gè)比較重要的段是“.reloc段”和“.dynsym段”。其中“.dynsym段”保存了需重定位符號(hào)的信息,包括符號(hào)名、符號(hào)類型、符號(hào)重定位入口等。“.reloc段”保存了符號(hào)重定位入口。動(dòng)態(tài)鏈接時(shí),只需根據(jù)“.reloc段”和“.dynsym段”中的信息,修改“.got段”中各符號(hào)指針的值即可。

        1.3軟件模塊的動(dòng)態(tài)加載模型

        假設(shè)SOC整機(jī)軟件進(jìn)行了良好的模塊化設(shè)計(jì)。模塊高內(nèi)聚、低耦合,每個(gè)模塊有若干全局函數(shù)作為入口,模塊內(nèi)其余函數(shù)均為靜態(tài)函數(shù)。整機(jī)軟件通過調(diào)用這些模塊實(shí)現(xiàn)某些功能[6]。這種情況下,待升級(jí)軟件可被細(xì)化為若干獨(dú)立的軟件模塊。這些軟件模塊可以是某應(yīng)用程序的專用子模塊,如數(shù)據(jù)包處理協(xié)議,也可以是某些應(yīng)用程序共用的子模塊,如硬件驅(qū)動(dòng)程序。此時(shí),對(duì)SOC的軟件進(jìn)行增量升級(jí)就可以抽象為加載并鏈接與待升級(jí)應(yīng)用程序相關(guān)的軟件模塊。

        圖3給出了鏈接時(shí)可能遇到的5種情況。結(jié)合前文對(duì)兩種鏈接機(jī)制的分析,下面對(duì)這些情況分別進(jìn)行討論。

        圖3 新模塊替換原模塊示意圖Fig.3 Sketch of new module replacing the original one

        1)升級(jí)模塊替換原工程中的函數(shù)

        通過對(duì)原工程ELF文件的分析,獲得原工程中函數(shù)Global_Fun1()的LMA,改寫此處值為0x00007001(無條件轉(zhuǎn)移指令機(jī)器碼),并在其后寫入升級(jí)模塊中函數(shù)Global_Fun1()的VMA,這樣就將升級(jí)模塊的入口函數(shù)靜態(tài)鏈接到了原模塊中。

        2)升級(jí)模塊訪問原工程中的全局函數(shù)

        函數(shù)Global_Fun2()需在升級(jí)模塊中以類似c++中虛函數(shù)的方式定義為外部全局函數(shù)。鏈接時(shí)只需修改升級(jí)模塊“. got段”中Global_Fun2()的指針為原工程中Global_Fun2()的VMA即可。這樣就將原模塊中的全局函數(shù)動(dòng)態(tài)鏈接到了該升級(jí)模塊中。

        3)升級(jí)模塊訪問原工程文件中的全局變量Global_Var1

        升級(jí)模塊需定義該全局變量并初始化。為保證升級(jí)模塊和原工程文件模塊中同名全局變量的一致性,動(dòng)態(tài)鏈接器需修改升級(jí)模塊“.got段”中的Global_Var1的指針,使其指向原工程文件中的Global_Var1。

        4)升級(jí)模塊訪問模塊內(nèi)的靜態(tài)函數(shù)

        升級(jí)模塊采用PIC編譯技術(shù),對(duì)模塊內(nèi)定義的靜態(tài)函數(shù)的尋址代碼與模塊加載地址無關(guān),因此無需對(duì)該函數(shù)重定位。

        5)升級(jí)模塊訪問模塊內(nèi)的靜態(tài)變量

        同(4),PIC的代碼對(duì)模塊內(nèi)定義的靜態(tài)變量的尋址代碼與模塊的加載地址無關(guān),無需重定位。

        以某SOC為例,系統(tǒng)啟動(dòng)時(shí),Bootloader將Flash中從0x000000開始的代碼段一次性加載到從0x06000000開始的SRAM中,然后跳轉(zhuǎn)到SRAM中指定地址開始執(zhí)行。因此可以將Flash的高位地址空間,如從0x7F0000開始到0x800000 的64KB作為升級(jí)代碼的存儲(chǔ)空間,將相應(yīng)大小的SRAM的高位地址空間,如從0x6040000開始到0x6050000的64KB作為升級(jí)代碼的加載空間。因此,需修改原Bootloader,使系統(tǒng)啟動(dòng)時(shí)加載 Flash中的原始代碼和升級(jí)代碼到相應(yīng)的SRAM中。

        當(dāng)調(diào)用原工程中被升級(jí)的軟件模塊時(shí),靜態(tài)鏈接指令將該模塊的入口地址直接轉(zhuǎn)移到升級(jí)代碼加載區(qū)中新模塊的入口處。同時(shí)由于新模塊內(nèi)部采用了PIC等動(dòng)態(tài)鏈接技術(shù),因此新模塊中的尋址指令和加載地址無關(guān),模塊可正常工作。這樣就實(shí)現(xiàn)了軟件模塊的部分升級(jí)。

        2 軟件模塊動(dòng)態(tài)加載的設(shè)計(jì)方案

        如前文所述,為實(shí)現(xiàn)軟件模塊的增量升級(jí),SOC既要將升級(jí)模塊的入口函數(shù)靜態(tài)鏈接到原模塊中,又要將原模塊中的全局符號(hào)動(dòng)態(tài)鏈接到升級(jí)模塊中。因此SOC需要解析原工程文件和升級(jí)工程文件,并根據(jù)SRAM的使用狀態(tài)為升級(jí)代碼分配加載空間。為了減少SOC端的工作量,實(shí)現(xiàn)設(shè)備升級(jí)過程對(duì)用戶完全透明,可考慮將這些工作放在開發(fā)端進(jìn)行。這就要求開發(fā)端生成的升級(jí)數(shù)據(jù)包中包含完整的鏈接信息,以便SOC端的升級(jí)程序可以根據(jù)這些鏈接信息自動(dòng)實(shí)現(xiàn)待加載機(jī)器碼的鏈接、存儲(chǔ)和加載。

        2.1升級(jí)數(shù)據(jù)包格式定義

        升級(jí)數(shù)據(jù)包的文件格式設(shè)計(jì)如圖4所示。

        圖4 升級(jí)數(shù)據(jù)包格式Fig.4 The format of upgrade data packet

        其中“靜態(tài)鏈接信息”給出了加載該升級(jí)包后需靜態(tài)鏈接的符號(hào)數(shù)及各符號(hào)的地址?!吧?jí)模塊存儲(chǔ)區(qū)域調(diào)整信息”給出了Flash中需要搬移的代碼起始地址和長(zhǎng)度。“新模塊存儲(chǔ)地址信息”給出了待加載機(jī)器碼的存儲(chǔ)地址及長(zhǎng)度。

        2.2開發(fā)端生成升級(jí)數(shù)據(jù)包流程

        開發(fā)端先解析原工程目標(biāo)文件,記錄原工程中的所有函數(shù)和變量名稱以及地址等信息。然后再解析單獨(dú)編譯的升級(jí)模塊目標(biāo)文件。在完成合法性檢驗(yàn)(如是否和目標(biāo)平臺(tái)匹配、代碼是否地址無關(guān)等)后,根據(jù)嵌入式終端當(dāng)前 Flash和SRAM的使用狀態(tài),為模塊分配加載地址和運(yùn)行地址。然后再解析目標(biāo)文件的重定位信息,生成靜態(tài)鏈接指令并完成原模塊中全局符號(hào)的動(dòng)態(tài)鏈接。最后開發(fā)端將相關(guān)數(shù)據(jù)打包,生成最終的升級(jí)數(shù)據(jù)包。其工作流程如下圖所示。

        2.3嵌入式終端處理流程

        考慮模塊可能被多次升級(jí),每次的升級(jí)包中代碼長(zhǎng)度可能不同,因此嵌入式終端需進(jìn)行代碼存儲(chǔ)空間的維護(hù)工作,處理流程如圖6所示。

        如圖 7所示,假設(shè) SOC已加載了 Module1、Module2、Module3共3個(gè)模塊,模塊的實(shí)際大小分別為Size1、Size2、Size3,開發(fā)端預(yù)分配的空間大小分別為 Block1、Block2、Block3。為了盡量避免模塊升級(jí)時(shí)因升級(jí)代碼變長(zhǎng)而占用后續(xù)模塊的存儲(chǔ)空間,因此,每個(gè)模塊預(yù)分配的空間一般略大于其實(shí)際大小。在這種情況下,嵌入式終端新接收了一個(gè)升級(jí)模塊Module4,其實(shí)際大小為Size4,開發(fā)端為其分配空間為Block4。

        圖5 開發(fā)端生成升級(jí)數(shù)據(jù)包流程Fig.5 Flowchart of generating upgrade data packet by upper machine

        圖6 嵌入式終端處理流程Fig.6 Flowchart of SoC dealing with the upgrade data packet

        圖7 新模塊加載示意圖Fig.7 Sketch of loading a new module

        結(jié)合圖6所述處理流程,嵌入式終端針對(duì)不同情況采取的操作如下:

        當(dāng)Module4為新模塊時(shí),將該模塊直接加載到Module3之后并將模塊中的入口函數(shù)靜態(tài)鏈接到原工程文件中即可。

        當(dāng)Module4為Module2的更新,且Size4<Block2時(shí),用Module4覆蓋Module2,并完成Module4中入口函數(shù)的靜態(tài)鏈接即可。

        當(dāng)Module4為Module2的更新,且Size4>Block2時(shí),需將Module3向前移動(dòng)Block2大小,覆蓋原Module2,然后加載Module4。最后完成Module3和Module4中入口函數(shù)的靜態(tài)鏈接即可。

        3 結(jié) 論

        無操作系統(tǒng)下嵌入式處理器軟件增量升級(jí)方法分開發(fā)端和嵌入式終端兩部分,其中升級(jí)模塊的鏈接工作主要集中在開發(fā)端進(jìn)行,嵌入式終端只需接收升級(jí)數(shù)據(jù)包,并自動(dòng)調(diào)用軟件升級(jí)子程序即可完成軟件升級(jí)。因此,設(shè)備升級(jí)過程對(duì)用戶完全透明。同時(shí),當(dāng)模塊間的接口固定后,頂層模塊和子模塊可單獨(dú)編譯,當(dāng)整機(jī)軟件固化后,如需對(duì)子模塊進(jìn)行改動(dòng),獨(dú)立加載新的子模塊即可,頂層模塊無需修改。因此,這種增量升級(jí)技術(shù)在一定程度上實(shí)現(xiàn)了上層功能軟件與底層硬件無關(guān),提高了代碼的可重用性。此外,由于每次僅對(duì)部分模塊進(jìn)行升級(jí)更換,無需替換整機(jī)代碼,因此增量升級(jí)技術(shù)還能有效地減小升級(jí)數(shù)據(jù)包的大小和信道資源的開銷,從而提高了較小信道帶寬下的升級(jí)效率和一次成功率。

        經(jīng)實(shí)驗(yàn)驗(yàn)證分析,本文提出的設(shè)計(jì)方案可有效地實(shí)現(xiàn)無操作系統(tǒng)下SOC軟件模塊的增量升級(jí)。

        [1]黃繩雄,張榮芬.嵌入式設(shè)備遠(yuǎn)程在線升級(jí)技術(shù)的研究[J].電子設(shè)計(jì)工程,2012,20(9):172-173.

        [2]張藍(lán)博,張善從,陳蔚薇.嵌入式系統(tǒng)中的代碼動(dòng)態(tài)鏈接模型[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(16):4115-4117.

        [3]張和君,張躍.基于GNU工具的嵌入式Bootloader設(shè)計(jì)與開發(fā)[J].計(jì)算機(jī)工程,2006,32(15):277-279.

        [4]陳宇,廖湘科,李慰.靜態(tài)鏈接動(dòng)態(tài)庫的ELF文件軟件設(shè)計(jì)[J].微計(jì)算機(jī)信息,2008,24(3):162-164.

        [5]John R.LevineLinkers&Loaders[M].San Francisco:Morgan Kaufman,1999.

        [6]鄧偉,許揚(yáng)婧.一種基于TI TMS320 DSP的軟件動(dòng)態(tài)鏈接技術(shù)[J].電子設(shè)計(jì)工程,2012,20(11):167-169.

        An incremental upgrade method for SOC without OS

        WU Ke-an,LI Ting-sheng,WU Chuan-wei
        (The No.30 Institute of China Electronic Technology Corporation,Chengdu 610041,China)

        Generally,software on SOC without OS is upgraded by overwriting the whole codes.Modules cannot be upgraded independently.Therefore the structure and the linking procedure of object files are analyzed.According to the analyses,an incremental upgrade method for SOC without OS is presented.Firstly,the programmer compiles the new module independently.And then the object files are modified according the certain format which will be the final upgrade data packet.After that SOC receives the packet,loads and modifies the codes according to the protocol defined by the package.Experiments show that this method can upgrade software modules on SOC without OS independently and effectively.

        embedded system;incremental update;dynamic link;position-independent code

        TN492

        A

        1674-6236(2016)02-0161-04

        2015-03-17稿件編號(hào):201503228

        武柯安(1990—),男,山西孝義人,碩士研究生。研究方向:信息安全與保密通信、嵌入式系統(tǒng)。

        猜你喜歡
        符號(hào)
        幸運(yùn)符號(hào)
        符號(hào)神通廣大
        學(xué)符號(hào),比多少
        幼兒園(2021年6期)2021-07-28 07:42:14
        “+”“-”符號(hào)的由來
        靈魂的符號(hào)
        散文詩(2017年17期)2018-01-31 02:34:20
        怎樣填運(yùn)算符號(hào)
        變符號(hào)
        倍圖的全符號(hào)點(diǎn)控制數(shù)
        圖的有效符號(hào)邊控制數(shù)
        草繩和奇怪的符號(hào)
        欧美激情αv一区二区三区| 五月天婷婷一区二区三区久久| 亚洲av伊人久久综合性色| 日韩精品人妻视频一区二区三区| 人妻少妇-嫩草影院| 国产高清在线精品一区二区三区 | 中文字幕亚洲乱码熟女1区| 久久久久久国产精品免费免费| 黑人上司粗大拔不出来电影| 免费人成毛片乱码| 美腿丝袜一区二区三区| av网站免费在线浏览| 六月丁香综合在线视频| 亚洲AV无码一区二区三区日日强| 青青青草国产熟女大香蕉| 亚洲熟女少妇精品综合| 在熟睡夫面前侵犯我在线播放| 国产视频毛片| 精品亚洲视频免费观看网站| 蜜桃视频网站在线观看一区| 国产精品一区二区无线| 亚洲偷自拍另类图片二区| 一区二区三区视频免费观看在线| 中国一级特黄真人片久久| 国产高颜值大学生情侣酒店| 永久免费看免费无码视频| 亚洲乱码av中文一区二区第八页| 亚洲av成人无码一二三在线观看| 日韩精品无码一区二区三区视频| 久久久精品中文无码字幕| 一级黄色一区二区三区| 精品无码久久久久久国产| 亚洲欧洲精品成人久久曰影片| 熟女高潮av一区二区| 少妇高潮av久久久久久| 国产成人综合久久精品免费| 熟女系列丰满熟妇av| 国产亚洲精品av一区| 99re8这里有精品热视频免费| 国产乱子伦| 国产精品视频免费播放|