嵌入式Linux系統(tǒng)中的快速啟動(dòng)技術(shù)研究
預(yù)鏈接(Prelink)利用這一點(diǎn),修改ELF共享庫(kù)和二進(jìn)制文件,將鏈接信息加入到可執(zhí)行文件中以簡(jiǎn)化動(dòng)態(tài)鏈接重定位,從而使程序啟動(dòng)加快。預(yù)鏈接首先搜集要預(yù)鏈接的ELF二進(jìn)制文件及其所依賴的共享庫(kù),為每個(gè)庫(kù)分配唯一的虛擬空間位置,并將共享庫(kù)重新鏈接到這個(gè)基準(zhǔn)位置(動(dòng)態(tài)鏈接器要加載這個(gè)庫(kù)時(shí),只要虛擬空間地址未被占用,它就會(huì)將庫(kù)映射到指定位置);然后預(yù)鏈接解析二進(jìn)制或者庫(kù)中的所有重定位,并將重定位信息存放到ELF對(duì)象,還要將所有依賴庫(kù)的列表及校驗(yàn)和添加到二進(jìn)制文件或庫(kù)中。對(duì)于二進(jìn)制文件,還需列出所有的沖突(在共享庫(kù)的自然搜索范圍內(nèi)對(duì)符號(hào)的解析不相同)。在運(yùn)行時(shí),動(dòng)態(tài)鏈接器先檢查是否所有依賴的庫(kù)都已經(jīng)映射到指定的位置,而且?guī)煳募](méi)有變化,只考慮沖突而不用處理每個(gè)庫(kù)的重定位,這樣大大提高了程序啟動(dòng)的速度。使用時(shí)要注意的是,若共享庫(kù)發(fā)生了改變,則使用它的所有程序都要重新鏈接,否則程序仍要進(jìn)行耗時(shí)的正常重定位。
本文引用地址:http://m.butianyuan.cn/article/84199.htm3 XIP和文件系統(tǒng)優(yōu)化
3.1 代碼執(zhí)行方式
嵌入式系統(tǒng)中代碼的執(zhí)行方式主要有3種:
① 完全映射(fully shadowed)。嵌入式系統(tǒng)程序運(yùn)行時(shí),將所有的代碼從非易失存儲(chǔ)器(Flash、ROM等)復(fù)制到RAM中運(yùn)行。
?、?按需分頁(yè)(demand paging)。只復(fù)制部分代碼到RAM中。這種方法對(duì)RAM中的頁(yè)進(jìn)行導(dǎo)入/導(dǎo)出管理,如果訪問(wèn)位于虛存中但不在物理RAM中會(huì)產(chǎn)生頁(yè)錯(cuò)誤,這時(shí)才將代碼和數(shù)據(jù)映射到RAM中。
③ eXecute In Place (XIP)。在系統(tǒng)啟動(dòng)時(shí),不將代碼復(fù)制到RAM,而是直接在非易失性存儲(chǔ)位置執(zhí)行。RAM中只存放需要不斷變化的數(shù)據(jù)部分,如圖1所示。如果非易失性存儲(chǔ)器的讀取速度與RAM相近,則XIP可以節(jié)省復(fù)制和解壓的時(shí)間。NOR Flash和ROM的讀取速度比較快(約100 ns),適合XIP;而NAND Flash的讀操作是基于扇區(qū)的,速度相對(duì)很慢(μs級(jí)),因此不宜實(shí)現(xiàn)XIP。
圖1 完全映射和XIP的比較
XIP可以分為以下2種:
?、?內(nèi)核XIP。直接在Flash/ROM中運(yùn)行內(nèi)核,可以節(jié)省復(fù)制和映像解壓的時(shí)間。Linux 2.6.10內(nèi)核已經(jīng)包含了XIP支持。
?、?應(yīng)用程序XIP。直接從應(yīng)用程序代碼的存儲(chǔ)位置執(zhí)行,而不用將它加載到RAM中,這樣應(yīng)用程序的第一次執(zhí)行速度會(huì)比較快。要使用應(yīng)用程序XIP,應(yīng)該基于支持它的文件系統(tǒng)。
3.2 XIP文件系統(tǒng)
目前XIP文件系統(tǒng)的實(shí)現(xiàn)主要有2種: Linear XIP CRAMFS和Advanced XIP File System(AXFS)。
CRAMFS是一個(gè)壓縮的只讀文件系統(tǒng),本來(lái)用于桌面Linux系統(tǒng)的啟動(dòng),但CRAMFS經(jīng)過(guò)修改后可以支持嵌入式系統(tǒng)并支持XIP。Linear XIP CRAMFS用一個(gè)sticky bit對(duì)它管理的文件進(jìn)行區(qū)分,標(biāo)記為壓縮(按需分頁(yè))或者未壓縮(XIP)。如果文件標(biāo)記為XIP,則所有頁(yè)都不壓縮,而且要在Flash中連續(xù)存儲(chǔ)。在加載XIP文件時(shí),直接對(duì)所有頁(yè)地址進(jìn)行映射;而按需分頁(yè)的文件則在發(fā)生頁(yè)錯(cuò)誤時(shí),將相應(yīng)頁(yè)解壓到RAM中。
要?jiǎng)?chuàng)建Linear XIP CRAMFS文件系統(tǒng)映像,必須確定可執(zhí)行文件和庫(kù)文件的使用頻率,頻繁使用的文件適合于XIP,而其他文件應(yīng)該進(jìn)行壓縮。現(xiàn)在有一些工具(如RAMUST和CFSST)可以幫助判斷哪些文件需要XIP,而哪些不需要。下面就可以給XIP文件加上標(biāo)記并制作根文件系統(tǒng),以使用mkfs.cramfs工具為例:
chmod +t filenames
mkfs.cramfs-x rootfs rootfs.bin
另外,還要修改內(nèi)核配置參數(shù)以支持XIP:在啟動(dòng)選項(xiàng)中向默認(rèn)內(nèi)核命令字符串中加入
rootfstype=cramfs,選擇內(nèi)核XIP并設(shè)置XIP內(nèi)核物理地址;在驅(qū)動(dòng)程序中加入MTD對(duì)XIP的支持;在文件系統(tǒng)中加入對(duì)Linear XIP CRAMFS的支持。接下來(lái)就可以生成XIP映像了。
Linear XIP CRAMFS的一個(gè)缺陷在于它是基于文件的,即一個(gè)文件中的所有頁(yè)要么全部采用XIP,要么全部采用壓縮/按需分頁(yè),但事實(shí)上同一文件中不同頁(yè)的使用頻率區(qū)別也很大。AXFS是Intel公司開(kāi)發(fā)的一個(gè)新的只讀文件系統(tǒng),它從Linear XIP CRAMFS中繼承了許多方法,同時(shí)也進(jìn)行了一些改進(jìn)。AXFS的XIP粒度是基于頁(yè)的,并且自帶工具來(lái)判斷哪些頁(yè)需要XIP,哪些頁(yè)需要壓縮,從而更好地在速度和RAM/Flash的使用上取得平衡。
3.3 非XIP文件系統(tǒng)
XIP一般基于NOR Flash,成本相對(duì)較高。對(duì)于用戶數(shù)據(jù)量大的應(yīng)用,往往還要使用基于NAND Flash的,非XIP的文件系統(tǒng)常用的有JFFS2/YAFFS。
JFFS2是一種基于壓縮的文件系統(tǒng)。在多媒體應(yīng)用中,如果圖片、音視頻已經(jīng)經(jīng)過(guò)壓縮,則使用JFFS2無(wú)疑會(huì)給CPU帶來(lái)雙重的壓縮/解壓負(fù)擔(dān),訪問(wèn)速度也會(huì)受到影響。因此,在這類應(yīng)用比較密集的應(yīng)用中,采用不壓縮的文件系統(tǒng)(如YAFFS/YAFFS2)可以加快系統(tǒng)速度。
YAFFS/YAFFS2是專為嵌入式系統(tǒng)使用NAND Flash設(shè)計(jì)的日志文件系統(tǒng)。與JFFS2相比,減少了一些功能(例如不支持?jǐn)?shù)據(jù)壓縮),所以速度更快,掛載時(shí)間很短,對(duì)內(nèi)存的占用較小。YAFFS/YAFFS2自帶NAND芯片的驅(qū)動(dòng),用戶可以不使用MTD和VFS,直接對(duì)文件系統(tǒng)操作。YAFFS與YAFFS2的主要區(qū)別在于:前者僅支持小頁(yè)(512字節(jié)) NAND Flash;后者則可支持大頁(yè)(2 KB) NAND Flash,同時(shí)在內(nèi)存使用、垃圾回收、訪問(wèn)速度等方面有所改進(jìn)。
結(jié)語(yǔ)
快速啟動(dòng)對(duì)于嵌入式Linux系統(tǒng)是比較迫切的要求之一。本文通過(guò)分析嵌入式系統(tǒng)的引導(dǎo)過(guò)程和關(guān)鍵時(shí)延因素,提出了相應(yīng)的解決辦法,并對(duì)XIP文件系統(tǒng)進(jìn)行了介紹。由于啟動(dòng)速度非常依賴于硬件平臺(tái),而且有的方法互相排斥,因此在具體應(yīng)用時(shí)需要綜合考慮和選擇。
參考文獻(xiàn)
[1] Tim Bird R. Methods to Improve Bootup Time in Linux [R]. Proceedings of the Linux Symposium, Ottawa,2004.
[2] Karim Yaghmour. 構(gòu)建嵌入式Linux系統(tǒng)[M]. 北京:中電力出版社, 2004: 49-66.
[3] 陳莉君. 深入分析Linux內(nèi)核源代碼[M]. 北京:民郵電出版社, 2001: 477-499.
[4] 左大全,吳剛. 嵌入式Linux快速啟動(dòng)與XIP應(yīng)用[J]. 計(jì)算機(jī)工程與科學(xué),2006(12).
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論