使用buildroot建立嵌入式跟檔案
使用buildroot建立嵌入式根檔案系統
在嵌入式系統開發前期往往需要大量的除錯與測試工具,這些工具並不會引入到開發版或工程版中,主要為了減少韌體體積以及避免除錯或測試時對功能的影響,於是就產生了很多獨立小巧除錯工具集,類似PC上的DOC工具箱。busybox有嵌入式Linux環境除錯的瑞士軍力之稱,特點是工具豐富,體積小,可生成為靜態連結的執行檔案植入到目標系統中,也可以打包生成根檔案系統配合核心獨立完成各種測試。本文主要介紹使用busybox工具自動構建根檔案系統的buildroot軟體包,其集成了包括交叉編譯器、核心程式碼、根檔案系統生成以及補丁管理等各種功能,可以說是嵌入式開發的IDE。
Buildroot下載
Buildroot 是一種基於有序Makefile和patch等檔案構建完整嵌入式Linux系統的工具,目前由Peter Korsgaard維護,基於GPLv2釋出,專案主頁:buildroot, 我們可以使用下面命令下載最新程式碼,如果沒有額外的需求最好使用穩定分支。在寫這篇文章時的穩定分支是2013.08.x。
git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout -b 2013.08 origin/2013.08.x
Buildroot配置與編譯
Buildroot有與linux相似的配置環境,可以使用menuconfig對各種選項配置,由於不同的平臺構架編譯相關的配置差異較大,配置前需要詳細瞭解所使用的平臺SOC相關資訊,下面以手頭上現有的ARM架構exynos5410開發板為例,說明平臺相關的內容。
在Target Architecture選項裡選擇ARM(little endian),我們使用的SOC屬於小端,有關大小端的詳細解釋可以看這裡,如果你不清楚你使用的SOC,可以去供應商或ARM官網查詢。
接下來Target Architecture Variant選項使用cortex-A15,exynos5410是samsung最新推出的八核ARM處理器,採用大小核架構,4個A7針對日常應用,4個A15可滿足大型遊戲等複雜應用,提供低功耗高效能方案。
Target ABI是有關浮點模式的支援,這裡選擇EABI,也與工具鏈相關,VFP也支援VFPv5-D16,指令集用ARM標準。
完成了與體系結構相關的配置接下來就輕鬆多了,在Build options項下,可以enable compiler cache提高編譯速度,不過也可以不使用。不需要連結靜態庫,使用動態庫放在製作的根檔案系統裡,各種小工具都編譯成動態連結減小體積。是否在編譯時新增除錯資訊以及GCC優化選項等最好不要開啟如果沒有使用到。
由於是在x86環境編譯ARM目的碼,需要使用交叉工具鏈。為配置方便可以使用Sourcery CodeBench ARM 2013.05,在External toolchain下以選擇。為減小體積可以去掉不需要的locale支援,這裡選擇C en_US就可以。
在System configuration裡選擇使用mdev管理裝置,注意設定好除錯串列埠和波特率。接下來還有kernel、bootloader等配置,我們有單獨編譯這兩項,這裡只用來生成根檔案系統,有關busybox等工具配置可以使用預設。
注意Filesystem images需要根據我們的核心配置以及uboot支援來設定,在我使用的開發板uboot載入核心與ramdisk時需要image header,核心支援initial RAM filesystem,這裡使用cpio打包root filesystem並使用gzip壓縮。
根檔案系統分析
如果不出意外,完成上面的配置後使用make命令就能生成一個xx.cpio.gz的映像檔案,可配合核心啟動到我們需要的除錯模式。由於開發板上uboot需要image header才能正確處理檔案,可以使用下面命令新增。
mkimage -A arm -O linux -T ramdisk -C none -a 0x30800000 -n “buildroot” \
-d output/images/rootfs.cpio.gz buildroot-ramdisk.img
啟動後使用root登入就可以使用我們則剛剛製作的系統了,如果缺少工具可以使用上面的配置進入packages等新增,另外也可以使用cpio等工具解壓,再修改或新增自己的檔案重新打包。
mkdir init_rfs
cd init_rfs
gzip -dc < path_to_image/rootfs.cpio.gz | cpio --extract
ls
bin etc init lib32 media opt root sbin tmp var
dev home lib linuxrc mnt proc run sys usr
initrd RAM就是使用cpio打包並gzip壓縮的普通檔案,上述解壓後可以看到類似我們正在使用系統的目錄結構。如果要新增自己靜態編譯的測試工具,可以放在bin或usr/bin目錄,當然有原始碼也可以使用buildroot中的編譯器動態連結後再放進去,再方便也可以利用buildroot框架自動編譯,不需要重新拆包打包的,請參考官方手冊。修改完成後再打包回去。
find . | cpio -oc | gzip -c -9 >| path_to_image/rootfs_v1.cpio.gz
注意: 最後還需要新增image header才能被uboot支援。
總結
Buildroot是嵌入式系統開發的IDE,可以將bootloader、kernel等開發環境都整合到裡頭,其中也有豐富的工具包供除錯或應用使用,特別適合構建智慧閘道器、家用小型伺服器、物聯網路節點等專用裝置。想起在學校時做過一個便攜陣列,當時使用非公開的LTIB,不能更新核心以及複雜的互動等,如果有時間我會用buildroot重新整理,也是對以前老闆的交待吧!
相關連結
The Buildroot user manual
Step-by-step Buildroot/Busybox Root File System