熟女人妻水多爽中文字幕,国产精品鲁鲁鲁,隔壁的少妇2做爰韩国电影,亚洲最大中文字幕无码网站

技術頻道

娓娓工業
您現在的位置: 中國傳動網 > 技術頻道 > 技術百科 > 嵌入式Linux系統小型化技術

嵌入式Linux系統小型化技術

時間:2007-06-26 11:31:00來源:shixiang

導語:?介紹了Linux在嵌入式領域中的應用和宿主機、目標機開發模式,詳細地給出了精簡內核的實現過程
[摘要]: 介紹了Linux在嵌入式領域中的應用和宿主機、目標機開發模式,詳細地給出了精簡內核的實現過程。分析了glibc系統庫和ELF文件格式的結構和其中的共享庫裁剪技術的原理,提出并實現了一種庫裁剪方案。 關鍵詞: 嵌入式;Linux;小型化 一、 概述 嵌入式Linux一般是指對標準Linux發行版本進行小型化裁剪處理之后,適合于特定嵌入式應用場合的專用Linux操作系統。嵌入式系統通常是資源受限的系統,無論是處理器計算能力還是RAM或其他存儲器容量都比較“小”。因此,如何創建一個小型化的Linux作為操作系統開發成為首先需要考慮的問題。嵌入式Linux系統中普遍采用三層結構:核心層主要是Linux內核和模塊;調用接口層是以glibc庫為主的系統庫;應用層是根據用戶需求設計的應用程序。為了實現資源的高利用率,后兩層都以ELF文件形式存在,在運行過程中對外部功能代碼動態加載。 一般來說,建立交叉平臺開發環境是進行嵌入式軟件開發的第一步。宿主機與目標機硬件平臺的異構(處理器體系結構不同)是采用交叉開發的根本原因。另外,由于資源有限,直接在嵌入式系統的硬件平臺上開發軟件不方便、甚至不可能。因此,通常采用Host/Target開發模式,如表l。 宿主機(Host) 目標機(Target) 硬件 PC 或者工作站,其中x86CPU占優勢 嵌入式系統硬件,處理器多樣化(x86,ARM,PowerPC,MIPS,68K等) 軟件 Windows、Linux等桌面操作系統,豐富的集成開發環境(如WindRiver 的Tornado) 軟件資源有限,開發階段通常從宿主機下載 [align=center] 表1 交叉平臺發環境的特點[/align] 交叉平臺開發環境包括交叉編譯器、交叉調試器和系統仿真器,比如嵌入式Linux開發經常用的GNU工具鏈。開發者需要根據目標平臺來選擇合適的GNU交叉編譯器,然后在宿主機上面重新編譯內核和其他軟件,這樣得到的目標代碼才能拿到目標機上面運行。這個過程相當繁瑣且容易出錯。宿主機和目標機一般通過以太網或者串口連接。目前,世界上出現了數以百計的嵌入式Linux開發計劃和發行版本,比如:ETLinux,LPR,μC-Linux,ThinLinux等開發源代碼的項目,如表2所示。 名稱 特點 ETLinux 設計用于在小型工業計算機,尤其足PC/104模塊上運行 Linux Router Project LPR 的目標是用于路由器、接入服務器、瘦服務器等網絡沒備和嵌入式系統,可以安裝在一張軟盤上。類似的項目還有Linux On A Floppy(LOAF) μC-Linux 在沒有MMU 的系統L運行的Linux。同前支持Motorola DragonBall (M68EZ328), M68328,M68EN322, ColdFire, QUICC, ARM7TDMI,MC68EN302,Axis ETRAX,Inte]i960,PRISMA,Atari 68k等微處理器 ThinLinux 一個為嵌入式和特定應用制作的Linux發行版,運行在Intel和PC兼容硬件上 [align=center] 表2 幾種開放源代碼的嵌入式Linux發行版 [/align] 另外,還有:Coventive XLinux,LineoEmbedix,LynuxWorks BlueCat,MontaVista Linux等商業公司的發行版。同時,針對實時環境,有RT-Linux、RTAI等實時擴展。近年來,越來越多的目標系統選擇了性價比不斷提高的x86處理器和成熟的PC架構作為硬件平臺。LinuxDevices.com網站進行的調查顯示,嵌入式系統開發者在過去2年和未來2年選擇x86處理器作為目標平臺的比例分別為3l%和35%,高居首位。 對于宿主機和目標機都是PC兼容平臺的開發者來說,除了沿用上述模式之外,有更簡單的創建小型化Linux系統的方法:以一個常規的Linux發行版為基礎,編譯內核、復制所需的文件,并利用初始化RAM盤(initrd:INITial Ram Disk)機制創建根文件系統,就可以快速實現一個小型化Linux系統。 二、 小型化技術 Linux已經越來越廣泛地應用于各種嵌入式設備中。但是一般的Linux發行版都非常龐大,很難用于只有有限存儲空間的嵌入式設備。所以我們必須對Linux系統進行裁剪。Linux系統大致有以下4種主要的裁剪技術,使用這些技術可以有效地減小系統的尺寸且不會影響系統的性能。① 刪除冗余文件。一般的Linux發行版中都包含很多幫助文檔、輔助程序、配置文件和數據模板,在嵌入式系統中這些文件都是不必要的,完全可以刪除。甚至連配置文件中的大量注釋也都可以被去掉。② 共享庫裁剪。嵌入式系統的應用程序是有限的,共享庫中就可能有很多永遠不會被用到的冗余代碼,這些代碼就可以被刪除。③ 采用具有同樣功能的替代軟件包。Linux上有許多具有相似功能的軟件包,可以選擇其中占存儲空間較小的軟件包并其移植到嵌入式設備上,用來代替原來占空間較大那些的軟件包。④ 修改源碼。包括重新配置、編譯軟件包,去掉不需要的功能;增加軟件的模塊性,從而有利于提高裁剪效率;重新配置內核,去掉不需要的驅動和模塊。 1、精簡內核 與傳統嵌入式操作系統的微內核(Micro-kerne1)體系結構不同,Linux內核采用的是整體式結構(Monolithic),整個內核是一個單獨的、非常大的程序。其優點是能夠使系統的各個部分直接溝通,有效地縮短任務之間的切換時間,提高系統響應速度。缺點也是明顯的,即內核尺寸比較大,因為Linux內核不僅包括如任務調度、內存管理、中斷處理等基本的操作系統功能,同時還包括文件系統、網絡協議、沒備驅動程序等功能。 Linux內核是高度模塊化、可配置的,通過配置使內核具有不同的功能,從而減小內核的大小。例如,Linux支持的文件系統種類很多,包括ext2、ext3、FAT、Reiserfs、JFS等??梢愿鶕嶋H情況選擇所需的文件系統,比如僅僅把ext2文件系統編譯進內核。編譯內核的主要步驟如下(“#”代表命令提示符): # cd/usr/src/1inux-2.4 # make menuconfig # make dep;make clean;make bzlmage 編譯成功的內核文件為arch/i386/boot/bzlmage。具體方法參考內核源代碼包中的README文件。為了進一步增加靈活性、減小內核尺寸,Linux還提供了可加載內核模塊機制,內核中的很多功能可以編譯為模塊,在內核運行時動態加載,而不是直接編譯進內核。然而在嵌入式Linux系統中更傾向于根據需要編譯一個獨立的內核,較少使用模塊機制。這樣得到的內核通常在幾百kB甚至1MB左右,相對傳統的嵌入式操作系統內核來說是比較大的(比如包含文件系統和網絡支持的VxWorks內核大約250kB)。在進行內核配置時,開發者要比較了解各功能模塊之間的依賴關系,否則有可能造成編譯失敗。而在VxWorks內核的配置過程中,如果破壞了依賴關系,有比較明確的指示,從而避免這種錯誤。 2、共享庫裁剪 在小型化技術中,共享庫裁剪容易用軟件實現,做成自動裁剪工具,效果最明顯。下面重點介紹共享庫小型化技術,共享庫小型化的基本思想是通過提取和解析系統庫內目標文件、符號的依賴關系,通過對這些依賴構造關系模型進行關系演算,根據應用程序中的符號信息,在庫目標文件一級實現系統庫的小型化.實現上分為四步:a、確定待調函數集。在ELF文件內部,存在一個Elf32-Sym 數組結構的符號表,用于內部符號定義和外部符號引用,通過對這個符號表的分析可以將ELF應用程序中待調符號(系統函數)抽取出來,從而建立一個應用程序-待調函數符號的多對多關系。b、確定系統庫函數與目標文件的對應關系。系統庫邏輯上分成:庫、目標文件、符號三個層次,庫和目標文件都是ELF格式,通過對庫的映像文件*_pic.a和每個目標文件中的符號表分析得到庫。目標文件的定義關系、目標文件-符號定義關系和目標文件-符號調用關系。c、確定系統庫目標文件之間的相互依賴關系。通過對步驟b中相關關系的關系演算得到目標文件-目標文件的完全依賴關系。d、生成小型化系統庫。通過對應用程序-待調符號表和目標文件-目標文件依賴表的關系演算得到待調函數所依賴的目標文件集合,將它們進行重新鏈接即可得到最小化的庫文件。 2.1、共享庫裁剪技術的原理 共享庫中保存著預先編譯好的目標代碼,一般是被應用程序反復使用的公用代碼。在Linux系統中,應用程序與庫之間可以靜態鏈接或動態鏈接。靜態鏈接時,鏈接器從庫中選取應用程序需要的代碼,然后復制到生成的可執行文件中。顯然,當靜態庫被多個程序使用時,磁盤上、內存中都是多份冗余拷貝。動態鏈接時,鏈接器并不真的把庫代碼復制到可執行文件中;僅當可執行文件運行時,加載器才檢查該庫是否已經被其它可執行文件加載進內存,如果內存中不存在才從磁盤上加載該庫。這樣多個應用程序就可以共享庫中的代碼的同一份拷貝,節約了存儲空間。這也是嵌入式Linux系統使用共享庫的主要原因。 當使用靜態鏈接庫時,鏈接器會自動地只把庫中被使用的模塊鏈接到可執行文件中。但是這種方法沒有用在共享庫中,主要是因為在應用程序執行之前鏈接器并不知道應用程序最終用到了庫中的哪些部分。因此要對共享庫進行裁剪必須先分析動態鏈接的原理。 共享庫和可執行文件中都有若干個符號表,其中定義了一些外部符號,分為導出(export)符號和導入(import)符號這兩種。導出符號是指在該文件中定義但可以被其它文件使用的符號,一般是可以由其它文件調用的函數;導入符號是指被該文件使用了但并沒有定義的符號,一般是被該文件調用的函數,而且導入符號一般指明了定義該符號的共享庫。加載器在加載可執行文件或共享庫之前會先遍歷它的每個導入符號,檢查該符號的相關代碼是否已在內存中,否則先查找并加載定義該符號的共享庫。由于嵌入式Linux系統中的應用程序和共享庫一般都是確定的,共享庫中就可能存在永遠不會被別的文件調用到的導出符號,將這些符號的相應代碼從共享庫中刪除不會影響到系統的正常運行。 現有裁剪技術都是以上述原理實現的。下面則具體分析它的實現方法。 2.2、ELF文件符號提取 ELF格式是UNIX實驗室作為應用程序二進制接口而開發和發布的,ELF是目前廣泛應用于Linux系統中的一種文件格式。 2.2.1、 ELF文件進程映像加載 ELF文件開頭部分是一個ELF Header結構,它包含兩個指針,分別指向兩個數組結構:Program header table和Section headertable,Program header table中的數組元素對文件內部的可執行代碼段進行定位;Section header table中的數組元素保存相關重定位和動態鏈接信息.裝載器通過控制這兩類數組實現進程映像的加載。 2.2.2、 ELF文件的符號表和重定位過程 ELF文件的Section header table中有一個類型為SHT_DYNSYM的Section,該Section記錄了創建進程映像所需要的所有符號。 a、符號值確定和符號定位,ELF文件中字符串ection(.shstrtab)用于保存所有字符串,ELF頭通過e­_shstrndx域保存節頭名字字符串表(.shstrtab)的節索引。ELF文件中符號名字域值是.shstrtab節的一個字符索引:Syrnbol結構中St_name對應相應的字符串表一個索引,在相應的字符串表中對應其符號值,St_value對應兩類不同地址:對于文件內部定義符號,對應該符號內容的文件內部相對地址;對于外部調用符號,對應待調符號的地址(已解析)或重定位表中的一個入口(未解析)。St_info保存符號的類型和相應的屬性。 b、被調符號重定位。符號表中,STT-SEC-TION對應重定位入口信息表。重定位入口以數組的形式存在于ELF文件中,其中的R_offset保存著應用于重定位行為的地址,而R_addend對應一個偏移用于計算要存儲于重定位域中的值。R_info中給出受重定位影響的符號索引和重定位應用的類型。例如:當類型為R_386_JMP_SLOT時,符號值就對應一個.plt(過程連接表)入口的位置. c、外部符號裝載。對于外部符號代碼的裝載,裝載器通過lazy MODE裝載方式將外部符號代碼加載到進程映像中:首次調用外部符號通過PLT[0]中的裝載代碼和PLT[1]中出棧參數將待調符號代碼加載到.got表中;以后對此待調符號的調用通過對應.got表入口進行控制傳輸。 2.2.3、 ELF文件符號提取實現 對每個參與動態鏈接的共享目標文件來說,其程序頭表(Program header table)有一個類型為PT_DYNAMIC的入口元素。該入口所指向的段.dynamic section是一個Elf32_Dyn的結構數組.Elf32_Dyn結構中有一個屬性標志d_tag和一個聯合結構d_un,d_tag控制d_un中的解釋。數組中下標為DT_SYMTAB的入口指向符號表。通過對符號表、重定位表、過程連接表、全局過程表的相關控制結構進行分析,完成文件定義符號和待調符號的分離提取,算法如下:
ELF文件中定義符號和待調符號由其st_value所指的目標進行區分:對應于.plt表的待調符號需要重定位;對應于內部符號,如果是弱類型(WEAK)或全局類型(GL0BOL)則用于其它文件調用。通過對ELF格式中的待調符號的提取,建立起應用程序和符號的依賴關系。 2.3、嵌入式系統小型化結果與分析 對各個表進行連接得到應用程序依賴的目標文件集合。將集合中的目標文件無重復記錄并重新連接從而得到最小化庫。前后庫中各數據對比見表3。小型化后,系統庫內各組成部分顯著減少,庫被縮減近50%。對于日益龐大的嵌入式系統中的應用程序,根據庫文件內部的依賴關系,在其基礎上對應用程序進行優化裁減,對一般性應用可以使系統庫減小40%~50%。 小型化前 小型化后 目標文件(個) 1183 544 符號(個) 9118 4861 顯性依賴(條) 3819 1887 間接依賴(條) 120273 55425 庫大小 1242480byte 685032byte [align=center] 表3 系統庫小型化前后對照[/align] 三、 結束語 近年來嵌入式Linux技術迅速發展,各種商業和開放源碼的Linux發行版為不同的硬件平臺、不同的應用環境提供了多種選擇。Linux的文件系統事實上非常的龐大。構造一個嵌入式的Linux文件系統是一個很復雜的過程。如何讓文件系統在保證安全的前提下精簡得更緊湊、運行得更有效率,是需要深入探索的一個課題。特別是,共享庫裁剪技術能將庫中大部分冗余代碼裁剪掉,但要求庫的源碼編寫比較規范,不同體系結構需要有不同的處理等。但畢竟庫裁剪領域才發展不久,還不是很成熟。經過對該技術長時間的測試,相信我們能夠彌補它的不足,使它能夠在嵌入式Linux領域廣泛使用。通過以上方法,我們構造了一個精簡的嵌入式版本的Linux文件系統,它使得內核在系統盡量精簡的情況下能夠運行起來.并滿足產品和系統各方面的要求。

標簽:

點贊

分享到:

上一篇:HexSight 高性能的機器視覺軟...

下一篇:微能WIN-V63矢量控制變頻器在...

中國傳動網版權與免責聲明:凡本網注明[來源:中國傳動網]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(www.hysjfh.com)獨家所有。如需轉載請與0755-82949061聯系。任何媒體、網站或個人轉載使用時須注明來源“中國傳動網”,違反者本網將追究其法律責任。

本網轉載并注明其他來源的稿件,均來自互聯網或業內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。

網站簡介|會員服務|聯系方式|幫助信息|版權信息|網站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網-工業自動化與智能制造的全媒體“互聯網+”創新服務平臺

網站客服服務咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2025 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權所有
粵ICP備 14004826號 | 營業執照證書 | 不良信息舉報中心 | 粵公網安備 44030402000946號

主站蜘蛛池模板: 思茅市| 琼中| 奎屯市| 卓资县| 北海市| 延边| 聂拉木县| 赞皇县| 桦甸市| 天气| 江川县| 商南县| 漳浦县| 青川县| 尖扎县| 扎兰屯市| 文成县| 芜湖县| 铜川市| 兰坪| 六盘水市| 古蔺县| 胶南市| 金华市| 翁牛特旗| 北京市| 崇义县| 乾安县| 凤翔县| 方山县| 定安县| 贵南县| 宽甸| 霍林郭勒市| 黎平县| 大邑县| 澄迈县| 静乐县| 石景山区| 巴青县| 扶绥县|