當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]嵌入式系統(tǒng)中的模塊動(dòng)態(tài)加載技術(shù)

摘要 提出一種適用于嵌入式系統(tǒng)的模塊動(dòng)態(tài)加載技術(shù),設(shè)計(jì)實(shí)現(xiàn)簡(jiǎn)單,占用資源少,開(kāi)銷(xiāo)小,并且成功運(yùn)用于DeltaOS.可提高系統(tǒng)的靈活性和擴(kuò)屬性.介招加載與動(dòng)態(tài)鏈接的原理和應(yīng)用情況,解釋相關(guān)術(shù)語(yǔ),描述基本設(shè)計(jì)思路:詳細(xì)說(shuō)明該技術(shù)的核心。即模塊聲明、調(diào)用庫(kù)、兩級(jí)重定位表,最后給出結(jié)論。
關(guān)鍵詞 模塊 動(dòng)態(tài)加栽 嵌入式系統(tǒng)DeltaOS

引 言
    隨著電子技術(shù)的飛速發(fā)展,嵌人式設(shè)備應(yīng)用越來(lái)越廣泛,復(fù)雜度也越來(lái)越高。這使得硬件和軟件設(shè)計(jì)比例發(fā)生了很大變化,軟件開(kāi)發(fā)的比重越來(lái)越大。然而傳統(tǒng)嵌入式開(kāi)發(fā)過(guò)程中需要將應(yīng)用與操作系統(tǒng)編譯鏈接成一個(gè)整體,然后下載到目標(biāo)機(jī)上運(yùn)行。如果在調(diào)試過(guò)程中發(fā)現(xiàn)問(wèn)題,需要重新編鏈接然后重復(fù)下載運(yùn)行的過(guò)程。這樣的開(kāi)發(fā)流程周期長(zhǎng)而且繁瑣,已經(jīng)越來(lái)越不適應(yīng)快速市場(chǎng)化的需要。

    為了適應(yīng)多樣化的嵌入式應(yīng)用和加快嵌入式系統(tǒng)的開(kāi)發(fā)過(guò)程,除了需要可靠的基礎(chǔ)平臺(tái)軟件的支持,如帶有文件系統(tǒng)、網(wǎng)絡(luò)協(xié)議棧的RTOS和配套的集成開(kāi)發(fā)環(huán)境,更重要的是需要可以動(dòng)態(tài)擴(kuò)展的系統(tǒng)平臺(tái)。近年來(lái),新一代的嵌入式操作系統(tǒng)已經(jīng)開(kāi)始使用動(dòng)態(tài)擴(kuò)展技術(shù):將基本系統(tǒng)(包括操作系統(tǒng)以及其他共享功能調(diào)用庫(kù))和應(yīng)用程序開(kāi)發(fā)分開(kāi)處理,支持模塊更新和動(dòng)態(tài)加載技術(shù)。很多主流的傳統(tǒng)嵌入式操作系統(tǒng)廠(chǎng)商,如windRiver、Green HilIs、Lynxworks,都推出了面向航空航天、基礎(chǔ)通信設(shè)備等領(lǐng)域的高可靠、高性能的RTOS版本,支持應(yīng)用和系統(tǒng)組件的動(dòng)態(tài)加載和更新;而在消費(fèi)電子領(lǐng)域,相關(guān)的操作系統(tǒng)廠(chǎng)商,如symbian、Palm、Microsoft,更是積極推出了具有相應(yīng)功能的操作系統(tǒng),在新一代移動(dòng)設(shè)備上得到了廣泛應(yīng)用。

    為了成為可動(dòng)態(tài)擴(kuò)展系統(tǒng)平臺(tái),大部分嵌入式操作系統(tǒng)需要使用動(dòng)態(tài)加載技術(shù)??偟膩?lái)說(shuō),動(dòng)態(tài)加載是指應(yīng)用或者系統(tǒng)在運(yùn)行過(guò)程中需要使用某模塊的服務(wù),于是通過(guò)一系列預(yù)定的動(dòng)作將指定模塊加載到系統(tǒng)中,讓調(diào)用者繼續(xù)順利工作。它實(shí)現(xiàn)的關(guān)鍵就是加載與動(dòng)態(tài)鏈接技術(shù)。因?yàn)榧虞d和動(dòng)態(tài)鏈接互相依賴(lài),關(guān)系緊密,所以將兩者放在一起進(jìn)行討論。

1 加載與動(dòng)態(tài)鏈接機(jī)制
    加載主要負(fù)責(zé)將模塊程序從二級(jí)存儲(chǔ)設(shè)備(比如硬盤(pán)或者Flash)搬移到指定內(nèi)存空間,并且將模塊交由系統(tǒng)加載器統(tǒng)一管理。

    程序鏈接分為靜態(tài)鏈接、加載時(shí)鏈接和運(yùn)行時(shí)鏈接。靜態(tài)鏈接就是將程序和它運(yùn)行所需的全部庫(kù)鏈接成一個(gè)執(zhí)行文件。它的優(yōu)點(diǎn)是可以獨(dú)立運(yùn)行、速度快,但是它鏈接生成的代碼尺寸比較大。加載時(shí)鏈接是指程序在編譯鏈接時(shí)不會(huì)把它用到的庫(kù)鏈接到執(zhí)行程序中,而是在它被加載器加載時(shí)才解析執(zhí)行文件,依次把用到的庫(kù)裝載到系統(tǒng)中讓其運(yùn)行。它的優(yōu)點(diǎn)是程序本身代碼量減小,但運(yùn)行時(shí)程序占的內(nèi)存并沒(méi)有減小,同時(shí)增加了加載器的工作量。動(dòng)態(tài)鏈接是加載時(shí)鏈接的進(jìn)一步發(fā)展,它是指將庫(kù)的加載過(guò)程延遲到程序運(yùn)行時(shí)執(zhí)行。這種方式不會(huì)給程序引入額外的代碼,也不會(huì)增加加載器的開(kāi)銷(xiāo),只有當(dāng)應(yīng)用真正使用某庫(kù)時(shí)才會(huì)加載該庫(kù),減少了不必要的空間占用。它的缺點(diǎn)是可能會(huì)有一些運(yùn)行開(kāi)銷(xiāo)。

    嵌入式系統(tǒng)中動(dòng)態(tài)加載和普通的動(dòng)態(tài)鏈接概念類(lèi)似,但是嵌入式系統(tǒng)中的加載鏈接器有其自身的特點(diǎn):它是交叉加載,主機(jī)端做一部分工作,比如程序的重定位,執(zhí)行文件的解析等等;而目標(biāo)機(jī)端相對(duì)簡(jiǎn)單,主要做模塊搜索定位和空間分配,以及指定物理地址或者映射虛擬地址讓其運(yùn)行。一部分嵌入式系統(tǒng)不支持虛擬內(nèi)存,應(yīng)用和內(nèi)核共享存儲(chǔ)空間。當(dāng)系統(tǒng)加載了多個(gè)應(yīng)用到系統(tǒng)中時(shí),一般需要使用overlap技術(shù)來(lái)解決內(nèi)存空間有限的問(wèn)題,即是當(dāng)多個(gè)應(yīng)用的運(yùn)行地址空間沖突時(shí),加載器會(huì)凍結(jié)當(dāng)前暫時(shí)不運(yùn)行的應(yīng)用,讓新加載的應(yīng)用使用指定的地址空間,PairnOS中就采用了這樣的設(shè)計(jì)。對(duì)于支持虛擬內(nèi)存的嵌入式系統(tǒng),加載器的工作被大大簡(jiǎn)化,每個(gè)應(yīng)用都有可以運(yùn)行在同樣的虛擬的空間,不需要加載器為其重定位或使用overlap技術(shù),因此提高了工作效率。Vxworks6.O,WinCE都使用了這種設(shè)計(jì)。兩種方式在不同的領(lǐng)域都有比較多的應(yīng)用。

    文中提出的模塊動(dòng)態(tài)加載技術(shù)是基于支持MMU(Memory Management Unit)的32位嵌入式操作系統(tǒng),采用了加載與動(dòng)態(tài)鏈接技術(shù)。使用該技術(shù)構(gòu)建的嵌人式系統(tǒng)面向高端市場(chǎng),特別是對(duì)系統(tǒng)可靠性、安全性要求很高的領(lǐng)域。在DeltaOS新一代高可靠的版本HAR(High Available Reliable system)的研發(fā)過(guò)程中,即成功地實(shí)現(xiàn)了基于該設(shè)計(jì)的加載器LambdaLoader,達(dá)到了預(yù)期的性
能要求。

2 模塊動(dòng)態(tài)加載的設(shè)計(jì)
2.1 設(shè)計(jì)思路

    首先定義一些概念:模塊、目標(biāo)程序、接口函數(shù)地址表和調(diào)用庫(kù)(call Library)。
    ①模塊,主要是指加載器加載的一個(gè)單位,并且這里模塊的概念主要是強(qiáng)調(diào)它是為應(yīng)用或者系統(tǒng)提供一系列服務(wù)的提供者。
    ②目標(biāo)程序,是指模塊的使用者。它可以是應(yīng)用,也可以是另一個(gè)模塊。
    ③接口函數(shù)地址表(文中也稱(chēng)之為模塊重定位表),指在模塊中有一個(gè)數(shù)組表,該數(shù)組表的內(nèi)容是該模塊對(duì)外提供的函數(shù)接口的地址。
    ④調(diào)用庫(kù),是供模塊調(diào)用者鏈接使用的專(zhuān)有庫(kù)。它與相關(guān)模塊一一對(duì)應(yīng),將封裝了的模塊接口供目標(biāo)程序使用。除此以外,它還有一個(gè)運(yùn)行時(shí)才確定的模塊重定位表地址指針和模塊動(dòng)態(tài)查找定位的代碼。

    如果在系統(tǒng)中要實(shí)現(xiàn)動(dòng)態(tài)加載,首先需要一種模塊定位機(jī)制,使得調(diào)用者能夠在系統(tǒng)中動(dòng)態(tài)定位需要的模塊,其次是要能讓模塊與目標(biāo)程序動(dòng)態(tài)的關(guān)聯(lián)在一起,協(xié)調(diào)工作。為了解決這些問(wèn)題,需要一系列相關(guān)的設(shè)計(jì):規(guī)定模塊的聲明方式;簡(jiǎn)化目標(biāo)機(jī)端模塊地址空間定位的工作;重定位表的機(jī)制等等?;谶@樣的設(shè)計(jì),系統(tǒng)可以比較順利地實(shí)現(xiàn)動(dòng)態(tài)加載。模塊動(dòng)態(tài)加載的工作流程如圖l所示。這里描述的主要是目標(biāo)機(jī)端的工作。

2.2 模塊的聲明
   
模塊首先要定義它的相關(guān)屬性。這里使用模塊聲明文件來(lái)完成這個(gè)工作。模塊聲明文件中需要定義:模塊名字、版本、對(duì)外提供的API接口。在系統(tǒng)編譯模塊程序后,會(huì)調(diào)用一系列的script代碼。這些script會(huì)根據(jù)模塊名字查找模塊對(duì)應(yīng)的模塊聲明文件,并根據(jù)該文件生成供模塊調(diào)用者使用的調(diào)用庫(kù)和與模塊一起鏈接的附加庫(kù)。

    附加庫(kù)包含系統(tǒng)后臺(tái)通過(guò)調(diào)用script生成的接口函數(shù)地址表和模塊注冊(cè)函數(shù)。在每個(gè)模塊的初始化函數(shù)中,會(huì)調(diào)用一個(gè)模塊的注冊(cè)函數(shù)(該函數(shù)主要工作是向系統(tǒng)注冊(cè)模塊的名字和接口函數(shù)地址表地址)。當(dāng)模塊被加載時(shí),初始化函數(shù)會(huì)被系統(tǒng)調(diào)用,向系統(tǒng)注冊(cè)模塊信息,此后模塊交由加載器統(tǒng)一管理。

2.3 調(diào)用庫(kù)
   
每個(gè)模塊在提供一個(gè)模塊重定位表的同時(shí),必須提供一個(gè)與之對(duì)應(yīng)的模塊調(diào)用庫(kù)。別的目標(biāo)程序必須并且只能通過(guò)調(diào)用庫(kù)來(lái)使用這個(gè)模塊提供的服務(wù)。每個(gè)調(diào)用庫(kù)都有一個(gè)存儲(chǔ)本模塊重定位表的地址指針變量。該變量在模塊被目標(biāo)程序第一次使用時(shí)會(huì)被初始化為相應(yīng)模塊重定位表地址。

    在模塊第一次被目標(biāo)程序使用即開(kāi)始動(dòng)態(tài)加載過(guò)程時(shí),首先運(yùn)行的是調(diào)用庫(kù)的庫(kù)初始化代碼(Library initialcode),它通過(guò)指定的系統(tǒng)調(diào)用來(lái)初始化庫(kù)中的模塊重定位表基地址指針。此后每次目標(biāo)程序使用模塊提供的函數(shù)接口時(shí),都通過(guò)以下公式得到該接口的實(shí)際地址:模塊接口實(shí)際地址=模塊重定位表基地址+函數(shù)index×4

    在該公式中,函數(shù)index是指對(duì)應(yīng)函數(shù)在模塊重定位表中的數(shù)組下標(biāo)值。因?yàn)楦鶕?jù)模塊聲明文件生成的調(diào)用庫(kù)中已經(jīng)包含了每個(gè)函數(shù)的索引信息(index),同時(shí)在32位系統(tǒng)中需要乘以4得到準(zhǔn)確的偏移量,所以當(dāng)調(diào)用庫(kù)中重定位表地址被初始化后,可以通過(guò)這樣一個(gè)簡(jiǎn)單計(jì)算得到指定接口實(shí)際地址,完成函數(shù)調(diào)用。

    當(dāng)一個(gè)目標(biāo)程序使用了模塊,并正確動(dòng)態(tài)加載后,其關(guān)系如圖2所示。目標(biāo)程序中鏈接了調(diào)用庫(kù),包含了函數(shù)跳轉(zhuǎn)表和指向模塊重定位表基地址的指針(ModuleBase);模塊中則鏈接了附加庫(kù),包含了函數(shù)接口地址表(模塊重定位表)。調(diào)用模塊函數(shù)時(shí),經(jīng)過(guò)動(dòng)態(tài)加載模塊的過(guò)程以后,目標(biāo)程序的模塊重定位表基址指針指向了對(duì)應(yīng)模塊的函數(shù)接口表,然后函數(shù)調(diào)用就可以順利進(jìn)行了。

2.4 兩級(jí)重定位表
    在嵌入式領(lǐng)域,為了降低性能開(kāi)銷(xiāo)和增加確定性,目標(biāo)機(jī)端加載器不會(huì)做程序重定位,而將相關(guān)工作在主機(jī)端完成,所以目標(biāo)機(jī)端加載的所有程序都是絕對(duì)定位后的程序.為了實(shí)現(xiàn)系統(tǒng)動(dòng)態(tài)擴(kuò)展,必須使各個(gè)模塊能夠單獨(dú)鏈接生成執(zhí)行程序,并且運(yùn)行時(shí)不用關(guān)心彼此的定位,這樣即使一個(gè)模塊被動(dòng)態(tài)替換后也能同其他程序一起協(xié)調(diào)運(yùn)行。這里通過(guò)兩級(jí)重定位表機(jī)制來(lái)完成這個(gè)協(xié)調(diào)性的工作。

    對(duì)于內(nèi)核、操作系統(tǒng)組件模塊或提供服務(wù)給其他目標(biāo)程序使用的模塊,要維護(hù)一張本模塊提供的接口函數(shù)地址表(即模塊重定位表,這里稱(chēng)之為二級(jí)重定位表)。為了保證本模塊的向后兼容性,模塊必須保證其接口函數(shù)在模塊重定位表中的相對(duì)位置固定。即使今后不能提供這個(gè)接口函數(shù),也需要將其保留,以保證同以前版本的二進(jìn)制兼容性。
 
    在模塊的初始化代碼中,模塊通過(guò)系統(tǒng)調(diào)用向加載器注冊(cè)這個(gè)模塊重定位表的地址,注冊(cè)時(shí)需提供模塊名和模塊重定位表的地址。加載器中管理著一個(gè)稱(chēng)為一級(jí)重定向表的表格。這個(gè)表的表項(xiàng)是“模塊名”到“模塊重定位表地址”的映射。因?yàn)檫@只是一個(gè)映射關(guān)系,所以各個(gè)模塊對(duì)應(yīng)的表項(xiàng)在一級(jí)表中的具體位置是可以改變的。

    二級(jí)重定位表如圖3所示。

    使用兩級(jí)重定位表的規(guī)則如下:
    ①模塊可通過(guò)模塊重定位表向其他目標(biāo)程序提供接口函數(shù);
    ②目標(biāo)程序要使用別的模塊提供的接口函數(shù)必須通過(guò)對(duì)應(yīng)模塊的調(diào)用庫(kù)來(lái)實(shí)現(xiàn);
    ③目標(biāo)程序在使用別的模塊提供的接口函數(shù)之前,必須通過(guò)加載器提供的系統(tǒng)調(diào)用服務(wù)獲取對(duì)應(yīng)模塊重定位表來(lái)基地址初始化對(duì)方的調(diào)用庫(kù)。

結(jié) 語(yǔ)
   
該設(shè)計(jì)實(shí)現(xiàn)了在嵌入式系統(tǒng)中的模塊動(dòng)態(tài)加載與更新,使得在嵌入式軟件開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)人員可以更有效的設(shè)計(jì)系統(tǒng),共享資源,達(dá)到提高效率、產(chǎn)品快速市場(chǎng)化的目的。在基于DeltaOS的實(shí)現(xiàn)中,可以完成應(yīng)用的任意加載卸載,系統(tǒng)組件的動(dòng)態(tài)更新;多個(gè)應(yīng)用可以共享一個(gè)全局的模塊;一個(gè)應(yīng)用可以同時(shí)使用多個(gè)模塊等等。整個(gè)系統(tǒng)擴(kuò)展性和靈活性大大提高,較好地滿(mǎn)足了實(shí)際需要。但是設(shè)計(jì)中對(duì)容錯(cuò)性、健壯性的考慮還不夠,在應(yīng)用與模塊的間接調(diào)用處理上還有優(yōu)化的空間,所以在這些方面還需要進(jìn)一步改進(jìn)。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉