李博 劉作龍 錢軍琪 呂民強 蒲駿偉





【摘要】? ? 本文介紹了海思Hi3559AV100處理器運行Ubuntu Linux系統的適配過程,適配過程可分為內核適配,根文件系統適配,系統固化三個步驟。在Hi3559AV100平臺中適配Ubuntu系統,可以利用Ubuntu成熟的軟件生態提升系統配置的靈活性,滿足更多應用場景的需求。
【關鍵詞】? ? Ubuntu Linux? ? Linux內核? ? 根文件系統
引言:
隨著嵌入式硬件性能的不斷提升,采用arm64架構的處理器已逐步可以滿足Linux發行版的基本運行需求。部分Linux發行版如Ubuntu,也提供了arm64版本的系統,本文詳細描述了在海思的Hi3559AV100處理器運行Ubuntu系統的適配過程。在嵌入式平臺中使用Ubuntu,可以利用Ubuntu成熟的軟件包管理功能及豐富的軟件包資源,提升系統配置的靈活性,滿足更多應用場景的需求。
一、硬件平臺
本文使用基于Hi3559AV100的開發板作為硬件平臺進行Ubuntu系統適配。Hi3559AV100是海思公司推出的專業的相機SOC,使用先進低功耗工藝和架構設計,集成了雙核A73和雙核A53的大小核架構[1]。A73和A53均為arm64架構的處理器核心,可支持arm64架構的Ubuntu系統運行。
Hi3559AV100開發板主要包括以下硬件資源:1. Hi3559AV100處理器一片;2. 4GB容量DDR4內存;3. 8GB容量eMMC存儲;4. 1個RS232調試串口;5. 1 個RJ45 網絡接口。
二、Ubuntu系統
Ubuntu Linux基于Debian Linux的unstable版本發展而來,使用了debian系列的deb格式軟件包及apt軟件包管理工具。Ubuntu的出現提升了Linux發行版的易用性,造就了龐大的用戶群體及活躍的社區,目前在桌面領域及服務器領域份額已成為Linux發行版的領頭羊,在云計算等領域也提供了相應的解決方案并得到了廣泛應用。隨著ARM生態的不斷發展,arm64架構的CPU在性能上已經可以勝任Ubuntu發行版的運行需求,目前許多arm64架構的處理器廠商都已經為其開發板提供了官方的Ubuntu的適配,例如,Xilinx公司的Ultrascale+開發板以及著名的樹莓派平臺均為開發者提供了預裝的Ubuntu系統。Ubuntu也提供了其各主要版本的arm64系統下載鏈接。arm64架構下,Ubuntu僅提供其根文件系統,Linux內核由用戶針對其具體處理器及板級進行適配。本文描述針對Hi3559AV100處理器適配arm64版本的Ubuntu16.04系統。
三、適配過程
海思官方提供Hi3559AV100開發SDK,其中包含適配Hi3559AV100開發板的u-boot、Linux內核、根文件系統及開發用的軟件框架和實例程序。SDK中,Linux內核的默認配置可支持SDK中的根文件系統,但無法支持Ubuntu系統的運行,因此需要修改內核配置,編譯,生成支持Ubuntu的內核鏡像。得到可支持Ubuntu系統啟動的內核鏡像后,可進一步修改根文件系統,滿足使用需求,并生成固化用的文件系統鏡像,并最終固化至開發板,完成適配過程。
(一)環境準備
適配前需搭建如圖1所示的開發環境,開發主機環境為一臺安裝Ubuntu系統的PC機,按照文檔[2]安裝SDK并搭建了完整的開發環境,建立了有效的tftp服務器及NFS服務器環境。從Ubuntu下載鏈接下載的Ubuntu16.04系統的arm64版本壓縮包解壓至開發主機環境的NFS路徑下。開發板和開發主機通過以太網和串口連接,在開發調試階段,開發板上運行Linux內核存儲在開發主機端的tftp目錄中,通過網絡文件系統NFS掛載存儲于開發主機端NFS目錄中的Ubuntu系統。
(二)內核適配
通過實際測試,SDK安裝完成后,其內核版本為4.9,默認的配置不支持Ubuntu系統的啟動,需修改內核配置,在Linux內核源碼路徑下輸入如下命令打開Linux內核配置操作界面:
make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- menuconfig
在調試階段,Ubuntu系統部署在了開發機中,Hi3559開發板需通過NFS掛載根文件系統,默認的內核配置不支持根文件系統的NFS的方式掛載,因此首先配置內核的網絡部分和文件系統部分,開啟內核對根文件系統的NFS的方式掛載的支持,如圖2、圖3所示。
SDK中根文件系統中設置了基本的設備節點,確保了啟動時/dev路徑下具備基本的設備節點。Ubuntu使用udev機制,因而Ubuntu中/dev路徑默認為空,為保證系統啟動時具備基本的設備節點,需配置內核中的/dev/tmpfs選項,使得內核啟動后自行創建基本的/dev下的設備節點,如圖4所示。
Linux系統中,根文件系統掛載后,內核在根文件系統中尋找并執行init程序,開啟系統的初始化,SDK提供的根文件系統使用的是Sysvinit,而Ubuntu使用了功能更為強大的systemd,systemd需要使用內核的cgroups機制,因此需配置內核中cgroups相關選項,如圖5,圖6所示。
配置完成后,保存配置并退出,使用如下命令編譯Linux內核:
make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- uImage
編譯完成后就生成了內核文件uImage,Hi3559平臺下,要獲得可從u-boot引導啟動的Linux內核文件,還需使用SDK中的arm-trusted-firmware工具生成ATF+Kernel的鏡像文件fip.bin,該鏡像文件fip.bin可被Hi3559的u-boot正確啟動。
編譯內核后還需編譯內核模塊并安裝至NFS路徑下的Ubuntu文件系統中:
make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- modules
make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux-? \
INSTALL_MOD_PATH=/nfs/ubuntu? modules_install
編譯內核后還需編譯內核模塊并安裝后,NFS路徑中的Ubuntu系統可正確被內核啟動掛載,由于內核模塊安裝時自動設置了依賴關系,因此啟動后內核模塊將你被系統自動加載。
(三)根文件系統適配
目標機通過NFS網絡文件系統掛載運行Ubuntu系統,由于Ubuntu系統功能眾多,較為龐大,因此本文采用Ubuntu提供的最小化的base[3]系統作為Hi3559AV100適配Ubuntu的基礎根文件系統。Ubuntu base僅提供了最小化的系統能力,其他功能可通過聯網安裝獲取,因此需在開發環境中對Ubuntu根文件系統進行基礎設置,通過拷貝開發環境主機Ubuntu中的配置文件來更換NFS中Ubuntu系統的軟件源配置,用戶名密碼配置等,隨后即可啟動系統。在系統正常啟動后,使用軟件包管理工具apt安裝所需的軟件滿足實際使用需求,如net-tools,kmod等,如需編譯器可安裝gcc,g++等。
在開發板上啟動配置好的內核,通過NFS掛載Ubuntu系統,步驟如下:
1.啟動開發板,在u-boot出現shell提示符時在串口終端輸入任意按鍵,打斷默認啟動,修改啟動參數如下:
setenv bootargs “mem=2048M console=ttyAMA0,115200 noinitrd root=/dev/nfs rw \
nfsroot=192.168.0.100:/nfs/ubuntu,proto=tcp,nfsvers=3,nolock \
ip=192.168.0.120:192.168.0.100:192.168.0.1:255.255.255.0 \
blkdevparts=mmcblk0:1M(u-boot.bin),15M(kernel),7000M(rootfs)”
setenv bootcmd ”tftp 41000000 fip.bin;bootm 41000000”
按照上述命令設置bootargs參數,可配置內核啟動時以NFS的方式掛載根文件系統,根文件系統位于ip地址為192.168.0.100的主機的/nfs/ubuntu路徑下,并指定了開發板的ip地址為192.168.0.120。設置blkdevparts的目的在于告訴內核開發板的emmc芯片分區按照1M,15M,7000M劃分為3個分區。
2.在u-boot的shell中輸入boot命令,u-boot將根據配置先從tftp加載fip.bin文件至內存的0x4100000地址,隨后從0x41000000地址啟動Linux內核。
3. Linux內核啟動后將按照bootargs的設置,掛載NFS中的Ubuntu根文件系統,掛載成功后,Ubuntu中的systemd啟動,初始化系統,當出現登陸提示符時,代表Ubuntu啟動完成。
Ubuntu系統啟動完成后,可以使用先前配置的用戶名及密碼登錄系統,并使用apt工具安裝需要的軟件包,并進行相應的系統功能測試,系統功能可滿足需求則根文件系統適配完成。
(四)系統固化
系統固化指將內核鏡像及Ubuntu根文件系統部署至開發板的emmc芯片內,可以脫離開發環境的tftp+NFS啟動系統的過程。
存放在開發環境主機中NFS路徑下的Ubuntu根文件系統,可在主機端使用Linux中的tar工具進行打包,隨后燒寫至eMMC 分區中。燒寫固化流程如下:
1.啟動開發板,在u-boot出現提示符時在串口終端輸入,打斷默認啟動,隨后在u-boot的shell中執行如下命令:
mw.b 0x42000000 0xff 0xf00000
tftp 0x42000000 fip.bin
mmc write 0 0x42000000 0x800 0x7800
將Linux內核鏡像文件下載至0x42000000,并燒寫如emmc中。
2.固化文件系統,在燒寫內核完成后,通過燒入的內核鏡像文件啟動,此時仍需掛載NFS,設置參數如下:
setenv bootargs “mem=2048M console=ttyAMA0,115200 noinitrd root=/dev/nfs rw \
nfsroot=192.168.0.100:/nfs/ubuntu,proto=tcp,nfsvers=3,nolock \
ip=192.168.0.120:192.168.0.100:192.168.0.1:255.255.255.0 \
blkdevparts=mmcblk0:1M(u-boot.bin),15M(kernel),7000M(rootfs)”
setenv bootcmd ”mmc read 0 41000000; bootm 41000000”
隨后輸入boot啟動系統。系統啟動后先格式化emmc的第三分區:
mkfs.ext4? /dev/mmcblk01p3
格式化后掛載該分區至/mnt路徑:
mount /dev/mmcblk01p3 /mnt
隨后將使用tar命令打包的Ubuntu系統解壓至/mnt路徑
tar xvf ubuntu.tar -C /mnt
解壓完成后,使用sync命令,確保文件寫入emmc中,至此根文件系統燒寫部署完成,可重啟開發板,設置啟動參數。
3.設置啟動參數。重啟開發板,在u-boot出現shell提示符時在串口終端輸入任意按鍵,打斷默認啟動,修改啟動參數如下:
setenv bootargs “mem=2048M console=ttyAMA0, 115200 noinitrd root=/dev/mmcblk01p3 \
rootfstype=ext4 rw ip=192.168.0.120 blkdevparts=mmcblk0:1M(u-boot.bin),15M(kernel), \
7000M(rootfs)”
setenv bootcmd ”mmc read 0 41000000; bootm 41000000”
隨后輸入saveenv保存設置,至此系統固化完成,重新啟動開發板后,將自動從emmc中加載Linux內核鏡像,并啟動emmc中的Ubuntu系統。與傳統嵌入式Linux難以靈活擴展功能不同,Linux發行版系統以軟件源的方式提供了豐富的軟件生態,系統啟動并登陸后,可以使用apt工具依據實際需求,安裝需要的軟件組件,支持豐富的應用場景。
四、結束語
本文指出了Linux發行版Ubuntu應用于嵌入式環境的方法,并在Hi3559開發板進行了驗證。隨著嵌入式硬件平臺性能的不斷提升,Linux發行版作為使用廣泛,便于擴展定制的基礎系統平臺必將更加廣泛的應用與嵌入式場景,為嵌入式開發者提供更好的系統通用性、靈活性,更適用于未來物聯網行業的開發及部署,提升應用的開發效率,縮短研發周期,使嵌入式產品更具競爭力。
參? 考? 文? 獻
[1] Hi3559A/C V100用戶指南
[2] Hi3559A/C V100開發環境用戶指南
[3] https://wiki.ubuntu.com/Base
李博(1988.06-),男,漢族,陜西銅川,碩士研究生,工程師,研究方向:Linux操作系統。