趙娜靖,佟志勇,李超然,李 勇,楊自恒,*
(1.黑龍江大學 電子工程學院,哈爾濱 150080;2.黑龍江省軍區(qū),哈爾濱 150001)
嵌入式技術的發(fā)展趨勢更傾向于自動化控制和人機交互。未來全面信息化及數(shù)字智能化的生產(chǎn)方向,使得嵌入式技術獲得了巨大的發(fā)展空間。嵌入式操作系統(tǒng)是嵌入式系統(tǒng)軟件平臺的核心,操作系統(tǒng)是管理計算機硬件資源,控制其他程序運行并為用戶提供交互操作界面的系統(tǒng)軟件的集合,是計算機系統(tǒng)的關鍵組成部分[1]。目前流行的現(xiàn)代操作系統(tǒng)主要有Linux、Android、Berkeley Software Distribution(BSD)、iOS、Windows等。
目前,大多數(shù)嵌入式設備所應用的都是Linux操作系統(tǒng)。針對嵌入式系統(tǒng),Linux內(nèi)核也在不斷更新與改進[2]。在Linux3.x之前版本的內(nèi)核源碼中,有大量的描述板級細節(jié)信息的冗余代碼,設備樹的引入有利于底層硬件規(guī)范化描述,使代碼不再冗余;內(nèi)核鏡像能支持多種平臺,即只需要更換設備樹文件便可以實現(xiàn)不同主板之間的無差異支持;但大多數(shù)嵌入式研究只關注了Linux系統(tǒng)的開發(fā)過程,忽略了設備樹平臺對于內(nèi)核的重要性。
通過介紹嵌入式系統(tǒng)的整體框架,分析了組成嵌入式系統(tǒng)的軟件和硬件平臺;詳細論述了設備樹的相關知識;并介紹了交叉開發(fā)環(huán)境的搭建與bootloader的選擇以及內(nèi)核、設備樹和根文件系統(tǒng)的制作,最終在目標板上成功移植帶有設備樹的Linux操作系統(tǒng)。
Linux系統(tǒng)是一個開源的操作系統(tǒng),源代碼完全公開,這個開源的特性能滿足嵌入式系統(tǒng)應用程序的開發(fā)[3]。Linux操作系統(tǒng)總體運行框架的構成見圖1。
圖1 Linux操作系統(tǒng)總體運行框架構成Fig.1 Overall operating framework of Linux operating system
一個嵌入式Linux系統(tǒng)框架通常可以分為4個層次[4]:①引導加載程序;②Linux內(nèi)核(kernel)、設備樹;③根文件系統(tǒng)以及Flash內(nèi)存設備上的其他文件系統(tǒng);④開發(fā)者應用程序。
ARM硬件開發(fā)平臺型號為iTOP-4412,其核心板是迅為電子推出的一款高端4核核心板,內(nèi)部配備了4個ARM Cortex-A9系列的CPU,芯片主頻達到了1 GHz,配備1 GB運行內(nèi)存,4 GB flash EMMC存儲,兼具快速讀取與超大容量,具有強大的浮點運算能力以及自帶多通道硬件渲染模塊架構,進行大量幾何運算也能及時處理。該板設計小巧,配備三星自家電源管理芯片,具有9路DC/DC和28路LDO輸出電源,在-20~70 ℃運行測試中運行良好[5],ARM開發(fā)板硬件實物圖片見圖2。
圖2 iTOP-4412開發(fā)板硬件實物Fig.2 Hardware of itop-4412 development board
設備樹早期出現(xiàn)于PowerPC Linux中,由于它的便捷性,近幾年逐漸被應用到ARM、MIPS、X86等架構上。它是一種描述板級硬件配置的樹形數(shù)據(jù)結構,來源于Open Firmware(OF)并繼承了Open Firmware IEEE 1275設備樹的定義[6]。在沒有引入設備樹之前,ARM平臺采用的是舊的機制,在內(nèi)核目錄下用代碼描述硬件,如注冊platform設備,聲明設備的resource等。這些代碼都是用來描述芯片平臺及板級差異的,對于內(nèi)核來講都是冗余代碼,不便于維護。設備樹可以描述CPU、時鐘、中斷控制器、I/O控制器、SPI總線控制器、I2C控制器、存儲設備等任何現(xiàn)有驅動單位。對具體器件能夠具體描述到使用若干個中斷,內(nèi)存映射空間的具體位置等,類似應用程序中的 XML 語言,易于對硬件信息進行配置,可以實現(xiàn)驅動代碼與設備的硬件信息相互的隔離,減少了代碼中的耦合性。
浙江力普在精制棉制備纖維素粉碎加工技術領域更是一枝獨秀———“醫(yī)藥輔料纖維素醚專用高效剪切粉碎機的研究和產(chǎn)業(yè)化項目”“GWM-730纖維素高效剪切磨開發(fā)”相繼被列入省市科技項目;高效纖維素剪切粉碎機、短纖維粉碎機均已獲得國家專利。為我國纖維素粉體行業(yè)提供了一種技術國際領先的超細纖維粉碎設備。
設備樹包含DTC(device tree compiler),DTS(device tree source和DTB(device tree blob)3種平臺類型[7]。其對應關系見圖3。
圖3 設備樹內(nèi)部對應關系Fig.3 Internal correspondence of device tree
DTS: dts文件是對設備樹的描述,放置在內(nèi)核的/arch/arm/boot/dts目錄。一個*.dts文件對應一個ARM的machine。dts文件描述了目標板的硬件資源。早期內(nèi)核版本記錄在mach-xxx文件中的內(nèi)容被轉為dts文件。
DTC:DTC為編譯工具,它將.dts文件編譯成.dtb文件。
DTB:DTC編譯*.dts生成的二進制文件(.dtb),bootloader在引導內(nèi)核時,會預先讀取.dtb文件到內(nèi)存,進而由內(nèi)核解析。
設備樹中還有一種. dtsi文件,由于同一個SOC可能有多個不同的電路板,每個電路板擁有一個.dts。這些dts會存在許多共通部分,為了減少代碼的冗余,設備樹將這些共同部分提煉保存在.dtsi文件中,供不同的dts共同使用。dts轉換成機器碼并在內(nèi)存里供 kernel 識別,見圖4。
圖4 dts轉換過程Fig.4 DTS conversion process
設備樹的應用可起到如下作用[8]:①平臺標識,即板級識別,讓內(nèi)核識別當前使用的是哪個開發(fā)板,識別的方式是根據(jù) root 節(jié)點下的 compatible 字段來匹配;②運行時配置,就是內(nèi)核啟動時啟動參數(shù)的配置,比如 bootargs 的配置,ramdisk 的起始和結束地址;③設備信息集合,集合了各種設備控制器。
首先,嵌入式系統(tǒng)移植需要搭建硬件和軟件交叉開發(fā)環(huán)境;其次,移植引導加載程序,即Bootloader;移植內(nèi)核Kernel、設備樹和根文件系統(tǒng);最后,根據(jù)項目需求移植或開發(fā)相關設備的驅動程序。這幾步完成后,移植到嵌入式開發(fā)平臺的Linux操作系統(tǒng)可在目標板上運行,通過超級終端控制臺進行一系列的命令操作控制目標板。若研究課題對圖形界面有要求,可以通過設備樹添加屏幕驅動等。對比嵌入式系統(tǒng)早期的驅動代碼編寫,設備樹下的驅動程序開發(fā)只需要通過提供系統(tǒng)的軟硬件信息,選配內(nèi)核代碼即可配置相關的驅動程序,提高了工作效率,降低了開發(fā)難度,圖形化界面更便于嵌入式系統(tǒng)進行應用程序開發(fā),為開發(fā)者提供便利[9]。
交叉開發(fā)是主機(PC端)開發(fā)出能夠在目標機(開發(fā)板)上運行的程序。嵌入式系統(tǒng)與PC機的架構不同,指令集不同,ARM屬于精簡指令集架構。PC機則為X86架構,以此架構來編譯后只能在PC機上運行,因此要使程序能夠在嵌入式系統(tǒng)上運行,需要搭建交叉開發(fā)環(huán)境[10]。此外,嵌入式系統(tǒng)的硬件資源限制較多,所以嵌入式開發(fā)需要借助PC機主頻較高等優(yōu)點來提高開發(fā)效率。
用USB線連接主機和目標板見圖5,在搭建交叉開發(fā)環(huán)境的過程中,下載arm交叉編譯器,在Ubuntu里進行解壓縮、修改環(huán)境變量、更新環(huán)境變量等操作,最后在Ubuntu 終端里輸入“arm-linux-gcc -v”指令來測試交叉編譯器是否安裝成功。
圖5 主機和目標板的接口連接Fig.5 Interface connection between host and target board
Bootloader 即引導加載程序,引導啟動內(nèi)核[11]。Bootloader的種類繁多,常見的有U-Boot、LILO、GRUB、Vivi、RedBoot等,不同的Bootloader有不同的使用范圍,其中使用范圍較為廣泛的是U-Boot(Universal Boot Loader),即通用的引導程序,它是支持GPL條款的開放源碼項目,此引導加載程序支持多種處理器架構,例如X86、ARM和PowerPC等, U-Boot可以被理解為一個小型的操作系統(tǒng)[12]。
U-Boot移植過程:①下載源碼包,在Ubuntu下解壓;②解壓后添加目標板(開發(fā)板)Exynos4412的信息,以便于移植;③修改相應目錄的Makefile文件,添加交叉編譯器;④針對目標板配置相應的參數(shù);⑤“make”指令編譯出u-boot.bin文件;⑥把編譯好的u-boot.bin文件燒寫進目標板的sd卡中,本次實驗采用sd卡的啟動方式。U-Boot啟動后在超級終端下的啟動信息見圖6。
圖6 U-Boot啟動信息Fig.6 Startup information of U-Boot
3.3 Kernel的裁剪、編譯和移植
3.3.1 NFS網(wǎng)絡服務
與普通內(nèi)核裁剪不同,本次實驗在制作內(nèi)核鏡像時添加NFS(Network File System)網(wǎng)絡服務支持。目前,NFS有諸多應用領域,其中最主要的是通過配置完成網(wǎng)絡文件的掛載。即用它實現(xiàn)網(wǎng)絡文件共享,系統(tǒng)移植過程中添加NFS網(wǎng)絡服務支持,開啟NFS功能,配置內(nèi)核支持網(wǎng)絡文件系統(tǒng),更改啟動參數(shù)[13]。
通過NFS服務,開發(fā)板可以實現(xiàn)掛載,進而對已制作完成的文件系統(tǒng)的完整性進行檢測。整個啟動過程中,用戶不需要將文件系統(tǒng)燒寫至Flash,就可以實現(xiàn)自動掛載。當Bootloader開始啟動,只要Kernel處于運行狀態(tài),它便會根據(jù)提前設置好的啟動參數(shù)完成自動掛載操作。在開發(fā)測試領域中,這種方式方便快捷,很大程度上提升了開發(fā)效率。
3.3.2 制作內(nèi)核鏡像
從Linux官方網(wǎng)站https://www.kernel.org/下載內(nèi)核源碼,本次移植選擇Linux4.14.2版本,該版本的內(nèi)核支持設備樹編譯。在Ubuntu中解壓縮,進入解壓完的linux-4.14.2目錄,修改平臺和編譯器使其能夠在arm上運行,即修改架構和交叉編譯器,修改完成后生成默認配置文件。
在內(nèi)核源碼目錄下輸入“make menuconfig”命令打開菜單配置窗口,首次進入菜單配置窗口時,不做任何操作直接退出,這樣在配置文件.config中保存開發(fā)平臺信息。然后再次進入窗口,進行選擇芯片類型、調(diào)試串口、驅動及添加文件系統(tǒng)的支持等設置,保存后退出。輸入“make uImage LOADADDR=0X40007000”編譯內(nèi)核,其中LOADADDR=0X40007000表示指定內(nèi)核的加載地址。
修改dts文件,進行設備樹的配置。進到內(nèi)核arch/arm/boot/dts/下,里面默認有iTOP4412的設備樹文件, 打開exynos4412-itop-scp-core.dtsi文件,修改設備樹文件。做如下修改:
第一處:注釋掉下面所示的4行代碼。
第二處:本次移植所需配置中沒有events屬性,需修改代碼中的events為event。
第三處:根據(jù)本次實驗使用的核心板原理圖,配置核心板電源芯片,保存退出。
在實驗過程中,為解決字符串溢出問題,將arch/arm/boot/dts/目錄下的exynos4412.dtsi文件中串口2節(jié)點serial_2的dmas屬性刪除,保存退出。最后輸入make dtbs命令編譯設備樹文件。Bootloader、uImage及設備樹在存儲設備中的地址分區(qū)見表1。
表1 地址分區(qū)
根據(jù)Linux操作系統(tǒng)的構成,根文件系統(tǒng)的制作和移植是嵌入式系統(tǒng)移植的最后一步。文件系統(tǒng)就是指文件存在的物理空間,Linux每個分區(qū)都是一個文件系統(tǒng),都有自己的目錄層次。
制作文件系統(tǒng),使用的是Busybox工具,拷貝busybox-1.21.1.tar.bz2至Ubuntu下進行解壓縮,解壓縮完成后進入該文件夾中,輸入“make menuconfig”命令進行配置,配置完成后執(zhí)行make命令開始編譯,再進行其他操作后成功生成system.img鏡像。
將制作好的的U-Boot、uImage、設備樹dtb文件、system.img通過usb下載燒寫到flash存儲介質(zhì)上,然后給開發(fā)板上電,系統(tǒng)會正常啟動,超級終端界面上將打印出啟動信息,見圖7。啟動信息包括有Linux內(nèi)核版本、 gcc交叉編譯工具鏈、CPU信息等。
圖7 目標板的啟動信息Fig.7 Target board startup information
圖7中Loading Device Tree to 4ffee000,end 4ffff034表示成功讀取設備樹。目標板的啟動信息說明了U-Boot正確引導并成功啟動內(nèi)核,讀取了設備樹文件,掛載最小文件系統(tǒng),加載了設備樹中配置的部分驅動程序。
將Exynos4412作為ARM平臺,對嵌入式平臺進行了帶有設備樹的Linux操作系統(tǒng)移植,成功啟動了目標板;在以往嵌入式系統(tǒng)的移植過程中沒有加入設備樹平臺,本次實驗對此進行了改進。在增加了設備樹后,許多設備硬件上的細節(jié)在啟動時將傳遞給內(nèi)核,舍棄了內(nèi)核中大量的冗余編碼,且同樣的外設硬件接到其他平臺,其驅動代碼邏輯無需加以改動,只需匹配設備樹提供系統(tǒng)的軟硬件信息即可,選配內(nèi)核代碼,提高了工作效率;通過在內(nèi)核裁剪時配置NFS網(wǎng)絡文件系統(tǒng),NFS服務可通過網(wǎng)絡讓不同的機器、不同的操作系統(tǒng)彼此共享文件,實現(xiàn)在線調(diào)試文件系統(tǒng)與應用程序,進而提高了調(diào)試效率;本次實驗驗證了移植方法的正確性,為之后驅動程序和應用程序的開發(fā)奠定了技術基礎。