<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式系統中的模塊動(dòng)態(tài)加載技術(shù)

嵌入式系統中的模塊動(dòng)態(tài)加載技術(shù)

作者: 時(shí)間:2006-08-09 來(lái)源:網(wǎng)絡(luò ) 收藏

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

對于內核、操作系統組件模塊或提供服務(wù)給其他目標程序使用的模塊,要維護一張本模塊提供的接口函數地址表(即模塊重定位表,這里稱(chēng)之為二級重定位表)。為了保證本模塊的向后兼容性,模塊必須保證其接口函數在模塊重定位表中的相對位置固定。即使今后不能提供這個(gè)接口函數,也需要將其保留,以保證同以前版本的二進(jìn)制兼容性。

在模塊的初始化代碼中,模塊通過(guò)系統調用向加載器注冊這個(gè)模塊重定位表的地址,注冊時(shí)需提供模塊名和模塊重定位表的地址。加載器中管理著(zhù)一個(gè)稱(chēng)為一級重定向表的表格。這個(gè)表的表項是“模塊名”到“模塊重定位表地址”的映射。因為這只是一個(gè)映射關(guān)系,所以各個(gè)模塊對應的表項在一級表中的具體位置是可以改變的。

二級重定位表如圖3所示。

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

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

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>