蔣琳嬌,劉 淼,金 星,
(1.中國科學院上海微系統與信息技術研究所 上海200050;2.浙江中科領航汽車電子有限公司 浙江 杭州311228)
嵌入式Linux 系統由于其可移植性好、可靠性高、功耗低等優點, 得到了迅速發展和廣泛應用。 伴隨著桌面環境KDE 的快速發展和普及,Qt 作為跨平臺的GUI 開發工具,很可能成為Linux 平臺上圖形界面開發最流行的工具。 對于提供圖形用戶界面的嵌入式系統,友好的人機交互界面及快速流暢的啟動過程是提高用戶體驗的重要因素[1]。
目前, 加快Linux 系統啟動的技術手段主要包括待機、休眠、常規啟動優化等。
待機技術是將信息保存在RAM 中并在待機時對RAM及相關芯片持續供電, 以便在下次啟動時將信息快速恢復,功耗較高。
休眠技術是將系統和應用程序啟動所需寄存器和RAM信息制成快照映像存儲在閃存中,啟動時對休眠所需的器件進行初始化,然后把快照映像從閃存復制到RAM,實現快速啟動,制作快照映像是主要難點。
常規啟動優化主要包括引導加載程序bootloader、 內核加載、應用程序優化3 個方面。針對一般嵌入式Linux 系統采用的內核映像由磁盤或Flash 拷貝到RAM 中再解壓執行的方法,通常采用芯片內執行(XIP,eXecute In Place)技術[2],在系統啟動時直接在非易失性存儲位置執行,省去了拷貝解壓過程。但這種方法更適用于NOR Flash,本文采用的實驗平臺中NAND Flash 由于基于扇區, 讀取速度較慢, 沒有專用SRAM 接口,可能存在壞塊等原因,并不適用XIP 技術。 在Qt作為開發環境的嵌入式系統中,采用Qt Quick 作為圖形用戶界面開發工具,能使界面更美觀靈活,但啟動速度不甚理想。
為了縮短嵌入式系統啟動時間,本文針對實驗用的基于全志A10 處理器的硬件平臺,提出了相應的常規啟動優化方案。 利用grabserial 工具來讀取并標記串口信息的時間,結合QML Profiler 采集的Qt Quick 應用程序信息, 對系統啟動時間進行分析和比較,針對主要的延時因素,從bootloader、內核加載、Qt Quick 程序3 個方面提出了優化方案。
嵌入式設備上電或復位后,CPU 通常執行位于Flash/ROM 中已知位置處的第一段代碼,即bootloader。它主要用來對CPU 及外設進行初始化,并調用Linux 內核。
Bootloader 在執行時一般分為兩個階段, 先將SPL(second program loader) 拷 貝 入 內 部RAM 執 行, 再 引 導uboot。 在uboot 啟動時會有幾秒等待按鍵來跳過自啟動的過程,占用了大量時間。
目前,SPL 不僅能完成CPU、PLL、DDR、 串口等的初始化,也能對設備上的操作系統進行控制[3]。 可采用SPL 替代uboot 直接加載Linux 內核的方法, 正常啟動時省去uboot 的執行過程。 由于串口線容易受到干擾,因此修改成固定按鍵進入uboot。 這樣在啟動時不再需要等待按鍵,SPL 直接調用內核,加快了啟動速度。
內核是Linux 操作系統的核心, 它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統。
優化內核主要從以下2 個方面考慮:
1) 減小尺寸。 內核映像的拷貝解壓過程花費了大量時間,小尺寸的內核能縮短拷貝及解壓所需的時間,使啟動速度更快。
2)減少初始化代碼。 裁減掉不必要的功能,減少加載內核時所需運行的代碼量,從而減少執行時間,加快啟動速度。
Bootloader 在調用存儲在NAND Flash 上的Linux 內核映像時, 需先將其從磁盤或Flash 等存儲設備拷貝到內部RAM 中,然后解壓并執行。
Linux 內核根據是否壓縮可分為兩種: 非壓縮內核Image 和壓縮內核zImage。 zImage 是Image 經過壓縮后,在開頭加上解壓縮的代碼形成的。Image 省去了解壓縮的過程,但是拷貝過程較慢,而zImage 拷貝過程較快,卻需要解壓縮后才能執行。
不同壓縮方式的壓縮率不同, 壓縮與解壓的速度也不同,高壓縮率對磁盤空間小的嵌入式系統更有用,壓縮速度只對創建內核時有影響,而解壓時間對系統每一次啟動都有影響。 很多壓縮算法都能應用于內核壓縮, 常用的有LZ4、LZO、XZ、LZMA、Gzip 等。
LZ4 與LZO 的壓縮率較差,LZ4 壓縮后的內核映像大小比LZO 大8%,但是解壓速度比LZO 快。LZO 的內核映像的大小比Gzip 大10%, 但壓縮和解壓縮速度較快。 XZ 內核映像大小比Gzip 小約30%,速度與LZMA 相當,相較Gzip 和LZO 較慢。
拷貝過程的速度取決于存儲設備的讀取速度, 解壓過程的速度取決于CPU 的運算速度。根據不同的系統條件選擇一種壓縮率和解壓速度達到最佳平衡的壓縮方式,盡可能加快內核映像加載速度。
嵌入式Linux 內核是PC 機Linux 內核經過裁剪、定制、修改、交叉編譯后得到的。 PC 機Linux 內核為了保證系統的兼容性和靈活性, 啟動時要進行大量硬件檢測和初始化[1],體積大,耗時長。 而嵌入式系統資源有限,且硬件設備基本保持不變,因此在嵌入式系統的應用中,通常會結合硬件條件并根據實際需求對內核進行配置,去除多余的組件,選擇所需要的功能和驅動,合理設置內核編譯配置選項。
內核的配置菜單分為常規設置、內核特性、設備驅動、文件系統等, 如文件系統的Second extended fs support、Quota support、CD-ROM/DVD filesystems、Pseudo filesystems 等模塊,在嵌入式系統中無需使用則可在配置過程中將其裁剪,如The Extended 4(ext4) filesystem、Native language support 模塊,可延遲至啟動后加載的部分則編譯為動態可加載內核模塊(LKM),LKM 是內核需要時可載入作為內核的一部分在內核空間運行,不需要時可卸載的代碼塊。
內核裁剪定制減少了內核啟動時運行的代碼量,也減少內核體積和內存占用,加快了啟動速度。
文件系統采用UBIFS,不同于傳統的文件系統,它不工作于塊設備上,如MMC、SD 卡、USB flash、SSDs 等設備,而是專為原始非易失性閃存 (raw Flash) 設計的。 UBIFS 工作于UBI 卷上,UBI 子系統是一個flash 設備損耗均衡和卷管理系統,它工作于MTD 設備上,MTD 相當于raw Flash。
UBI 鏈接MTD 設備時會先對其進行掃描,所消耗的時間和Flash 物理擦除塊數量成正比。 從Linux V3.7 開始UBI 系統推出了一個新的特性叫做fastmap 來減少初始化UBI 的時間。 fastmap 存儲了物理擦除塊到邏輯塊的映射關系、擦除計數、序列號等UBI 鏈接MTD 設備時所需要的所有信息。 因此在鏈接時,只需要讀取flash 的fastmap,這明顯少于JFFS2 掛載MTD 設備所需讀取的內容。另外,為fastmap 校驗需要花費一定的運算時間,但這與flash 的IO 時間相比微乎其微,因此fastmap 能使UBI 在幾乎恒定的時間內鏈接到MTD 設備[4]。
Fastmap 節省了掃描整個MTD 設備的時間, 將UBI 鏈接過程限制在一個幾乎恒定的時間,且不影響任何現有的UBI 魯棒性,而且在發現fastmap 被破壞的情況下能回到掃描模式。
在系統啟動時,一般會在串口終端打印啟動信息。 打印速度取決于串口的速度和處理器的速度, 受串口延時的影響。 可通過設置內核啟動參數“quiet”來控制內核的日志級別為4,使之處于靜默模式,只打印關鍵消息,縮短啟動時間。
在嵌入式設備創建用戶體驗方面的需求已發生巨大變化。 快節奏行業的用戶現在要求制作美觀的界面,以60 幀每秒的速度流暢運行,而且過渡、動畫和縮放都要平滑[5]。
應用程序采用的是高級用戶界面技術Qt Quick (Qt User Interface Creation Kit),開發人員和設計人員可用它協同創建動畫觸摸式用戶界面和應用程序。 Qt5.2 引入了一個場景圖形渲染器,Qt5.3 嵌入式企業版發布了Qt Quick 編譯器[5],進一步改善了Qt Quick 的圖形性能,為系統釋放了更多的CPU時間并且更加有效的使用GPU。
一個精細的用戶圖形界面程序在嵌入式設備上運行時往往產生啟動速度慢、動畫不順暢、延時過長、幀速率過低等問題。 針對啟動速度慢的問題, 采用Qt Creator 自帶的QML Profiler 來遠程調試分析嵌入式設備上應用程序的啟動時間開銷,并從以下幾個方面提出優化方案。
圖片對于用戶界面來說至關重要, 而加載圖片的時間開銷也很大。GPU 處理速度和性能有限,且Frame Buffer 大小有限, 大批量使用圖片或者使用大容量圖片會減緩處理速度,延長開機時間,降低幀速率。 針對這一問題,提出以下幾個圖片優化方案:
1)一般來說,本地圖片能立刻被加載,此時用戶接口被堵塞,直到加載完成。 如果需要加載一張大圖,最好使用低優先級的異步線程來加載,設置圖片asynchronous 屬性為true。 如果圖片來自網絡而非本地, 那么它將被自動地異步加載,線程和狀態屬性也會被適當更新。
2)圖片在內部被緩存和共享,因此如果幾個圖片元素的資源相同,那么只會有一個圖片元素被加載。因此盡可能使用同一資源,將其鏡面對稱或更改其他屬性來達到預期效果。
3)圖片在QML 交互界面中經常是內存的最大使用者。對于不組成交互界面的圖片,特別是從外部加載或者用戶提供的內容,建議圖片尺寸通過sourceSize 屬性來限定。
4)只在必須的時候設置圖片smooth 屬性。
5)在應用程序中,可將不產生相對移動或其他如透明度、顏色等變化的幾張圖片合并。
在精細的用戶界面應用程序中, 會使用大量經過精心設計和排版的圖片和文字。 啟動時若加載龐大的QML 文件將造成開機速度慢,內存占用大等問題。 動畫設計的需要,會使大量圖片產生相對移動,無法合并。 一般其他一些元素在開機動畫結束后才顯示出來,如果在程序加載時將所有元素都創建,則所有數據都會讀入內存中,這使得啟動和運行速度變慢。
為了在啟動時減少加載內容, 可將應用程序分割成幾個QML 文件,每個文件包含一個邏輯UI 實體,按需求加載UI。 當程序啟動時,僅加載需要顯示的部分,當開機界面完成后,再進行其他工作。 loader 能夠用來動態加載及卸載QML文件或組件對象,它允許了延時創建在程序啟動加載時不使用的元素,直到這些元素需要使用時才創建,不需要時則釋放,用延時的方式盡可能減少啟動時所需工作,加快了程序啟動速度,減少了內存占用,提高了幀速率。
使用Qt Quick 開發應用程序周期短,與傳統的C++程序不同,它在運行時動態加載QML 資源,即時編譯技術用于生成機器代碼,加速執行JavaScript 和QML 綁定表達式。 但在程序啟動時, 需要解析并動態加載QML 文件才能成為可見的交互界面。
Qt5.3 在嵌入式企業版里首次推出了一個新的專業編譯工具,Qt Quick 編譯器,它能保護QML 文件資源的知識產權,并且提高加載速度,改善性能。 Qt Quick 編譯器會將QML 文件進行預解析, 連同JavaScript 文件一起翻譯成C++中間源代碼,在傳統的編譯器編譯后,代碼被鏈接到最終二進制文件[6]。 所有的解析工作都在編譯時間完成,縮短了加載時間,提高了性能,對于使用Qt Quick 來做交互界面的設備和應用程序的啟動時間會有很大改善,Qt 官網表明, 一個典型的中型Qt Quick 應用程序經過編譯后啟動速度相較之前快30-40%[7]。
硬件平臺:全志A10 處理器,主頻1 GHz
非易失性存儲器NAND Flash 4G
動態存儲器SRAM 512M
軟件平臺:移植好的u-boot
內核Linux-sunxi 3.4
根文件系統buildroot
文件系統ubi/ubifs
圖形界面開發工具Qt 5.3
通過grabserial 和QML Profiler 工具采集系統啟動時間,實驗數據證明,本文提出的啟動優化方案在bootloader、內核加載、Qt Quick 應用程序3 個方面都有明顯的改善效果。 最終啟動時間為5.3 s,各優化部分實驗數據如表1 所示。

表1 啟動優化方案效果Tab.1 Optimization effect of boot time
優化bootloader,采用SPL 直接啟動內核的方式,省去了uboot 的運行,以及5 s 等待按鍵的過程,總體運行時間縮短5.3 s。
內核配置,將不需要的內容裁剪,啟動時不使用的內容編譯成模塊。 未經裁剪的內核映像通過LZO 方式壓縮,體積為5.1 M,裁剪后僅2.3 M,優化后啟動時間縮短0.6 s。
內核幾種壓縮方式的比較結果如圖1 所示。 LZ4 與LZO的壓縮率較低但解壓速度快,拷貝與解壓時間短。 LZ4 壓縮后的內核比LZO 稍大,但解壓更快,最終結果幾乎相同。
UBI 掛載MTD 設備時,一般分區越大,掛載時間呈線性增長; 使用fastmap 可使掛載時間相對恒定。 在分區大小為4G 的條件下,使用fastmap 縮短了4 s 的啟動時間。

圖1 幾種壓縮方式的比較Fig. 1 Comparing diagram of several methods of compression
優化或者關閉調試串口的輸出, 至少可以縮短1 s 的啟動時間。
Qt Quick 應用程序在優化前, 通過QML profiler 可以看出其編譯和創建元素的時間很長,占用5.9 s,編譯創建完成后才開始繪制交互界面,如圖3(a)所示。
將QML 文件分割, 把程序啟動時不需要的元素采用Loader 形式延遲至必要時再動態加載,這樣程序啟動時間縮短至5.1 s,如圖3(b)所示。

圖2 fastmap 效果與分區大小的關系Fig. 2 Relationship of fastmap effect and partition size
對應用程序中的圖片進行優化, 刪除不必要的圖片,合并多余的圖片,啟動時間減少到4.6 s,如圖3(c)所示。
采用Qt5.3 中推出的Qt Quick 編譯器, 使得QML 內容能夠在程序運行之前就預解析完成,啟動時不再占用時間來解析QML,大大縮短了程序啟動時間,為2.8 s,如圖3(d)所示。 相較未經過Qt Quick 編譯器編譯時的啟動時間4.6 s,縮短了39%。

圖3 Qt Quick 應用啟動時間分析Fig. 3 QML Profiler analyzation on boot time of Qt Quick application
本文對基于Linux 和Qt Quick 的嵌入式系統啟動進行了分析,提出了由SPL 直接調用內核,選用適合的內核壓縮方式,采用fastmap 掛載文件系統,在應用程序中減少圖片,采用新的Qt Quick 編譯器等優化方案,由實驗采集的數據證明,啟動時間縮短73%,優化效果顯著。 嵌入式系統軟硬件結構復雜多樣,在相應的實際場合中靈活應用,可加快系統啟動速度,提供更好的人機交互。
[1] 陳軍,涂亞慶. 加快嵌入式Linux系統啟動速度的方法及應用[J]. 后勤工程學院學報,2005(3):54-58.CHEN Jun,TU Ya -qing. Analysis and Application of Accelerating the Boot Process for An Embedded Linux System [J].Journal of Logistical Engineering University,2005(3):54-58.
[2] 段紅祥, 孫棣華, 劉衛寧等. 基于內核啟動優化的嵌入式Linux快速啟動方案[J].計算機工程與設計,2009(1):16-18.YIN Xiang-hong,SUN Di-hua,LIU Wei-ning,et al.Fast booting method based on kernel booting improvement in embedded Linux[J].Computer Engineering and Design,2009(1):16-18.
[3] SPL[DB/OL].(2012-11)[2014-06-25].http://forum.xda-develdevelopers.com/wiki/index.php&title=SPL&oldid=29084.
[4] Richard Weinberger. UBI: Fastmap request for inclusion(v18)[EB/OL]. 2012.9.[2014-06-25]. http://lwn.net/Articles/517422/.
[5] Digia updates Qt Enterprise Embedded to deliver enhanced development and deployment experience for embedded device creation [EB/OL]. 2014.5 [2014-06-29]. http://qt.digia.com/About-Us/News/Digia-updates-Qt-Enterprise-Embedded-to-deliver-enhanced-development-and-deploymentexperience-for-embedded-device-creation/.
[6] Qt Quick Compiler[EB/OL].2014[2014-06-30]. http://doc.qt.digia.com/QtQuickCompiler/index.html.
[7] Tuukka Turunen. Qt 5.3.1 Released [EB/OL].2014.6 [2014-06-30]. http://blog.qt.digia.com/blog/2014/06/25/qt-5-3-1-released/.