導(dǎo)讀:嵌入式Linux開發(fā)大體上可以分為三個(gè)部分BSP開發(fā)、系統(tǒng)集成、應(yīng)用開發(fā),一般公司開發(fā)會(huì)有不同的人員分別負(fù)責(zé)這三個(gè)大的部分。就本文談到Linux系統(tǒng)構(gòu)建而言,主要涉及到BSP、系統(tǒng)集成兩個(gè)方面。對(duì)于從業(yè)人員而言了解Linux系統(tǒng)的構(gòu)建過程,會(huì)對(duì)Linux系統(tǒng)有更加深入的理解。
1. 基本概念
1.1 嵌入式開發(fā)主要任務(wù)
首先想談?wù)剬?duì)于Linux開發(fā)這三個(gè)方面的大體內(nèi)容,具體有哪些開發(fā)工作:
BSP開發(fā):移植bootloader以及Linux 內(nèi)核,開發(fā)Linux設(shè)備驅(qū)動(dòng)
系統(tǒng)集成:將用戶空間所需的組件集成進(jìn)系統(tǒng)并進(jìn)行配置,同時(shí)開發(fā)升級(jí)恢復(fù)機(jī)制。
應(yīng)用開發(fā):開發(fā)特定業(yè)務(wù)的應(yīng)用軟件或者庫(kù)
而對(duì)于Linux的啟動(dòng)過程,大體如下圖:
當(dāng)然對(duì)于不同的體系結(jié)構(gòu)會(huì)有所不同,本文主要基于ARM進(jìn)行討論。
至于Bootloader、內(nèi)核的移植、驅(qū)動(dòng)開發(fā)不在本文的討論范圍。假定都是完備可執(zhí)行的。那么Buildroot可以幫我們做什么呢?Buildroot可以完成Bootloader的配置編譯、內(nèi)核的配置編譯、根文件系統(tǒng)的配置編譯、用戶空間所需的軟件組件及庫(kù)的配置編譯等工作。
1.2 常用的Linux構(gòu)建系統(tǒng)
常見的嵌入式構(gòu)建系統(tǒng)有Yocto/OpenEmbedded,PTXdist, Buildroot,OpenWRT 等等。。。
比較流行的有兩種:
Yocto/OpenEmbedded:使用二進(jìn)制包構(gòu)建完整的Linux發(fā)行版。功能強(qiáng)大,但有些復(fù)雜,而且學(xué)習(xí)曲線相當(dāng)陡峭。
Buildroot:構(gòu)建一個(gè)根文件系統(tǒng)映像,沒有二進(jìn)制包。使用,理解和修改要簡(jiǎn)單得多
2. Buildroot之初體驗(yàn)
2.1 Buildroot簡(jiǎn)介
Buildroot的特點(diǎn):
可以構(gòu)建工具鏈,rootfs,內(nèi)核,引導(dǎo)程序
易于配置:menuconfig,xconfig等
快速:只需幾分鐘即可構(gòu)建一個(gè)簡(jiǎn)單的根文件系統(tǒng)
易于理解:用大量書面文件制作
小型根文件系統(tǒng),起始于2 MB
提供2500多個(gè)用于用戶空間庫(kù)/應(yīng)用程序的軟件包
支持多種架構(gòu)
知名技術(shù):make和kconfig
具有最讓用戶心動(dòng)的設(shè)計(jì)目標(biāo):
簡(jiǎn)單易用
易于定制
可復(fù)制的構(gòu)建
小根文件系統(tǒng)
而事實(shí)上,Buildroot確實(shí)如其期望一樣,簡(jiǎn)單易用,用戶體驗(yàn)友好。詳細(xì)請(qǐng)參考:https://buildroot.org/
2.2 基本的步驟
Buildroot的使用主要有以下幾個(gè)步驟:
下載:從下面網(wǎng)址選擇你需要的版本
https://buildroot.org/download.html
你也可以:git clone git://http://git.busybox.net/buildroot
配置:可選的有以下幾種配置方式:
make menuconfig,這無疑是為大家所熟知的,因?yàn)閮?nèi)核正式基于kconfig語言的配置方式。需要ncurses的支持
make nconfig,需要ncurses的支持
make xconfig,需要QT的支持
make gconfig,需要QTK的支持
編譯:make
部署: 位于。/output/images/下 是生產(chǎn)的bootloader鏡像,內(nèi)核鏡像以及根文件系統(tǒng)壓縮包。
2.3 基本配置
對(duì)于一個(gè)最小系統(tǒng)而言,我們需要配置以下一些基本配置就可以進(jìn)行編譯了:
本文基于TI的DM3730為例進(jìn)行描述。
TI公司的DM3730微處理器是由1GHz(同時(shí)支持300,600和800MHz)的ARM Cortex-A8 Core和800MHz(同時(shí)支持250,520和660MHz)的TMS320C64x+ DSP Core兩部分組成,并集成了3D圖形處理器,視頻加速器(IVA),USB 2.0,支持MMC/SD卡,串口等。DM3730 pin-to-pin兼容DM3725、AM3715、AM3703處理器,支持高清720p視頻編解碼。
2.3.1 Target配置
根據(jù)芯片手冊(cè)很容易做出如上配置。所以關(guān)于目標(biāo)機(jī)的配置,主要是包括大小端、目標(biāo)機(jī)二進(jìn)制格式、目標(biāo)機(jī)內(nèi)核變種、浮點(diǎn)支持選項(xiàng)、指令集選擇。
2.3.2 Build 配置
主要配置以下一些內(nèi)容:
配置文件保存位置,將配置文件保存的好處是,在重新構(gòu)建時(shí),值需要調(diào)用
make 《xxx_defconfig》
然后make,而不必重新全部配置。
配置下載位置,因?yàn)橄到y(tǒng)構(gòu)建的時(shí)候需要從網(wǎng)絡(luò)上抓起很多軟件報(bào)的代碼進(jìn)行編譯構(gòu)建。這個(gè)一般不需要修改。
strip target binaries建議使能,這樣會(huì)使文件尺寸變小。
對(duì)于其他的選項(xiàng)基本可以不做修改。
2.3.3 工具鏈配置
工具鏈配置非常重要,不容出錯(cuò):
工具鏈可選擇外部可執(zhí)行工具鏈,亦可以自行編譯,或者本地存放的廠商提供的二進(jìn)制工具鏈。本例選則本地可執(zhí)行二進(jìn)制包。
工具鏈前導(dǎo)符,本文選擇arm-none-linux-gnueabi,這取決于所用芯片的體系結(jié)構(gòu),需與所配的工具對(duì)應(yīng)! 另外需要注意的是浮點(diǎn)的支持,需與所選芯片是否有硬件浮點(diǎn)計(jì)算單元匹配,且與上面提到的目標(biāo)機(jī)浮點(diǎn)配置對(duì)應(yīng)。
外部GCC版本,選擇所需的版本。
內(nèi)核頭文件版本,這個(gè)選項(xiàng)至關(guān)重要,需與你用的內(nèi)核版本對(duì)應(yīng)
GDB調(diào)試,這個(gè)建議選上,方便后面系統(tǒng)調(diào)試
MMU支持,一般地需要MMU支持。
對(duì)于其他一些選項(xiàng),不做詳述
2.3.4 系統(tǒng)配置
主機(jī)名:根據(jù)需要定義一個(gè)字符串,是控制臺(tái)前面的提示符xxx@vsi
密碼加密方式:根據(jù)需要選擇加密算法
init系統(tǒng):這里選擇busybox,輕量級(jí)使用非常廣泛。可選的有systemV,systemd.
設(shè)備表,可以默認(rèn)即可
符號(hào)鏈接,這個(gè)可選
shell,因?yàn)榍懊孢x擇使用busybox,通常嵌入式會(huì)選擇busybox提供的shell工具集
其他還有諸如語言、時(shí)區(qū)、用戶表、根文件系統(tǒng)覆蓋、本地腳本加載等不做一一描述了。需要提示的是,如果需要需要修改根文件系統(tǒng)的某部分,可以考慮使用根文件系統(tǒng)覆蓋。
2.3.5 內(nèi)核配置
對(duì)于內(nèi)核可選擇本地壓縮包,亦可以選擇從代碼庫(kù)、網(wǎng)絡(luò)進(jìn)行抓取
補(bǔ)丁選項(xiàng),如果有補(bǔ)丁需要打,可使能
內(nèi)核格式,因?yàn)椴捎胾-boot這里選擇uImage
內(nèi)核代碼壓縮格式,因?yàn)榍懊孢x擇的是.gz格式,故這里選gzip
設(shè)備樹,因?yàn)楸纠膬?nèi)核并不支持設(shè)備樹,故未使能。值得一提的是,現(xiàn)行的內(nèi)核大多采用設(shè)備樹對(duì)硬件層進(jìn)行抽象剝離。
內(nèi)核擴(kuò)展,這里有以下一些選項(xiàng):
Adeos/Xenomai Real-time patc,
FB TFT drivers,
ev3dev Linux drivers
Aufs Filesystem Module patch
內(nèi)核工具,有以下一些選項(xiàng):
可根據(jù)硬件系統(tǒng)需要進(jìn)行裁剪,這些工具非常有用。
2.3.6 Target package配置
根據(jù)需要進(jìn)行配置,需要提到的是,這個(gè)配置非常有用,可實(shí)現(xiàn)豐富的客制化軟件包的支持,公司內(nèi)部自研的應(yīng)用包、庫(kù)可以由此進(jìn)行集成。
2.3.7 Filesystem images配置
可將output/target生成的根文件系統(tǒng)打包成一個(gè)鏡像,需要注意的是output/target下生成的根文件系統(tǒng)由于權(quán)限等原因是不可以直接加載的。例如不可以用NFS進(jìn)行掛載。
2.3.8 Bootloaders配置
本例采用本地壓縮包,類似內(nèi)核配置,也可以通過網(wǎng)絡(luò)進(jìn)行抓取,需要注意的是網(wǎng)絡(luò)抓取的代碼很多移植工作應(yīng)該沒有完成,除非已經(jīng)聲明支持的板子能找到對(duì)應(yīng)bootloader代碼倉(cāng)庫(kù)。當(dāng)然如果內(nèi)部已經(jīng)開發(fā)完成,并有版本系統(tǒng)管理,這里就可以配置為從版本倉(cāng)庫(kù)抓取了。
對(duì)于Host utilities/Legacy config options 對(duì)于最小系統(tǒng)可不做配置。
最后一步,完成配置,保存設(shè)置。
建議:保存.config 用如下命令
mv .config 。/configs/xxx_defconfig
下次修改,只需執(zhí)行make xxx_defconfig就會(huì)加載本次的配置。
3.編譯部署
完成了配置后,只需要執(zhí)行 make,則在。/output/images/下就會(huì)得到如前所示的bootloader,uImage,rootfs.tar,然后就可以部署在目標(biāo)板上進(jìn)行運(yùn)行了。
至此,我們的Buildroot快速通關(guān),就順利通關(guān)了,是不是很容易,很方便!
公號(hào)里面內(nèi)容更多,歡迎關(guān)注交流.
評(píng)論