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