APP下载

Hi3559处理器Ubuntu系统适配

2022-05-09李博刘作龙钱军琪吕民强蒲骏伟

中国新通信 2022年5期

李博 刘作龙 钱军琪 吕民强 蒲骏伟

【摘要】    本文介绍了海思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操作系统。