2021年
第4期
【摘要】基于NXP 公司开发的i.MX8处理器,使用Xen 虚拟化设计启动Linux 双系统,在原有的嵌入式Linux 单系统中
加入Xen Hypervisor ,通过定制U-Boot 、Domain-0内核、Domain-U 内核,修改设备树分配硬件资源,并开发双屏显示驱动程序,完成了Linux 双系统的启动和双屏显示,实现“一机双系统双屏”,验证了嵌入式虚拟化方案在智能座舱系统上应用的可行性。
主题词:智能交通i.MX8嵌入式虚拟化
Xen Linux 双系统
中图分类号:U462.1
文献标识码:A
DOI:10.19620/jki.1000-3703.20200821
Design of A Dual-Linux System Based on Xen Virtualization Project
on i.MX8
Ni Zihao 1,He Zhaodan 1,2,Geng Yang 2,Zhang Kai 1,2
(1.Tsinghua Shenzhen International Graduate School,Shenzhen 518055;2.Shenzhen Adan Energy Information Technology
Co.,Ltd.,Shenzhen 518126)
【Abstract 】Based on the i.MX8processor developed by NXP,Xen virtualizati on is utilizedto start a dual-Linux system.By adding Xen Hypervisor to the original embedded single Linux system,customizing the U-Boot,Domain-0kernel,Domain-U kernel,modifying the device tree to allocate hardware resources,and developing a dual-screen display driver,a dual-Linux system startup and dual-screen display is constructed.The feasibility of the embedded virtualization
solution in the intelligent cockpit system is verified through “one machine,two systems,two screens ”.
Key words:Intelligent transportation,i.MX8,Embedded virtualization,Xen,Linux,Dual
system
倪子豪1
何照丹1,2
耿杨2
张凯1,2
(1.清华大学深圳国际研究生院,深圳518055;2.深圳市阿丹能量信息技术有限公司,深圳518126)
基于i.MX8虚拟化Xen 方案的Linux 双系统设计
汽车技术·Automobile Technology
1前言
随着汽车多元化需求的增加,车载系统向着智能座舱方向发展,成为同时具有交通、娱乐、办公和通讯等多种功能的综合平台。现代化的智能座舱系统在保证车辆安全、稳定的前提下,对信息、娱乐和辅助驾驶的集成提出了新的要求。智能座舱需要集成度更高、感官效果更好的整体系统,因此需要将组合仪
表、中控台等多个工作目的、性能要求不同的系统进行集成。
目前,汽车普遍将2套完全独立的系统分别安装于2个处理器上,分别负责仪表的数据处理与显示,以及信息娱乐功能。该方法需2套硬件资源,成本较高,且2个系统需要通过总线或以太网协议进行信息交互,系统
间交互较为复杂。另一种方法是使用虚拟化系统,即在1套硬件资源上通过虚拟化技术运行2个系统。若沿用类似VMWare 的基于软件的虚拟化方案,会增加系统代码量,从而影响可靠性。因此,必须寻新的基于硬件的虚拟化方案,通过采用多核方案实现硬件虚拟化,从而兼顾安全性与成本。
Xen 是开源的虚拟化管理软件,其核心是虚拟机监
视器,负责完成CPU 调度和内存资源分配[1],具有高性能和占用资源少的特点,且与操作平台的结合极为密切,并支持ARMv8嵌入式架构。相比于其他虚拟化方案,Xen 相对成熟,且其ARM 架构支持相对前沿。在各种车载嵌入式系统的虚拟化中,Xen 的应用相对较少。在国外:Avanzini 等人[2]提出了基于Xen 的车载系统虚拟
【引用格式】倪子豪,何照丹,耿杨,等.基于i.MX8虚拟化Xen 方案的Linux 双系统设计[J].汽车技术,2021(4):1-5.
NI Z H,HE Z D,GENG Y,et al.Design of a Dual-Linux System Based on Xen Virtualization Project on i.MX8[J].Automobile Technology,2021(4):1-5.
-
-1
化方案,将Linux系统和ERIKA实时系统进行整合;Luca等人[3]的研究表明,Xen和KVM都可以作为实时管理程序,并提供了一些减少延迟的指导机制,有利于提高Xen在车载系统中的实时特性。在国内,主流的方案有:使用ARM和Windows Embedded CE设计车载系统[4];使用嵌入式Linux进行开发,例如结合图形界面QT设计车载虚拟仪表[5]等;王冲[6]提出了基于Xen的半虚拟化系
统设计,讨论了Linux与μC/OS-Ⅱ系统结合的性能,但由于μCOS-Ⅱ目前尚未开源,所以无法定制开发。
基于以上背景,本文使用NXP公司开发的高配版i.MX8系列处理器,基于i.MX8系列ARMv8架构处理器,使用Xen虚拟化方案实现Linux双系统的启动。
2通用引导加载程序设计
2.1通用引导加载程序
在嵌入式Linux系统常用的引导加载程序(BootLoader)中,通用引导加载程序(Universal Boot Loader,U-Boot)使用频率最高。其“通用”有两层含义,一是支持多种不同的嵌入式操作系统,二是支持诸多常用系列的处理器。U-Boot项目的开发目标与之契合,即支持尽可能多的嵌入式处理器和嵌入式操作系统。本文对U-Boot进行一些定制化设计,将Xen引导命令编译入U-Boot,使其能够正常启动虚拟机管理器。
U-Boot目录分为3类:与处理器架构和板极硬件相关的代码;通用函数和驱动、检测程序;参考文档和工具。修改代码时只需要修改/arch/arm、/board、/configs、/include 目录下有关开发板和处理器架构等方面的配置文件。2.2U-Boot的修改与设计
U-Boot启动过程分为3个阶段,其中第3个阶段主要任务是加载内核并跳转到内核启动。而Xen Hypervisor 是类似内核的模块,因此U-Boot设计与修改的重点在于了解第3个阶段如何调用内核并传递必要参数。
按照正常的单系统启动流程,应在内存中将U-Boot、Linux系统内核、根文件系统等启动相关的镜像按照图1的顺序加载。
图1Linux单系统启动流程
Xen是一个微内核,作为Linux虚拟机的管理者,需要先于Linux系统启动,在Xen虚拟化方案下的启动镜像应按照图2的顺序加载。
图2Xen虚拟化方案下Linux双系统启动流程
比较图1和图2可以明确需对U-Boot进行的修改:将传递给Linux和Xen的参数全部传递给Xen内核,并加载Xen内核到内存中,最后启动Xen Hypervisor。
基于上述分析,本文对U-Boot进行了如下修改:a.在定义环境变量中加入有关Xen启动的变量:#define XEN_BOOT_ENV
b.对Xen Hypervisor使用参数进行定义,包括命令行为串口1、加载地址为0x80280000、启动介质为SD 卡,在此基础上传递Linux系统Domain-0启动所需参数,包括加载地址为0x85000000、分配内存2048M和分配4个虚拟CPU。最后定义指令run xenmmcboot作为U-Boot命令行调用这些代码加载Xen内核的入口:"xenmmcboot="\
"setenv get_cmd\"fatload mmc${mmcdev}: ${mmcpart}\";"\
"setenv console${xenlinux_console};"\
"run mmcargs;"\
"run xenboot_common;"\
"\0"\
通过以上操作,完成了U-Boot的设计与修改,设置了启动方式和命令,使U-Boot从SD卡启动,使得U-Boot 启动目标为复制Xen内核到内存中,最后启动Xen内核,并将控制权交给Xen Hypervisor。经过上述修改,对Xen 加入内存前、后的内存空间进行比较,如图3所示。
(a)Linux单系统(b)虚拟化Linux双系统
图3Linux系统和Xen虚拟化方案Linux双系统内存空间分布3特权域Domain-0设计与启动
3.1Domain-0内核配置与编译
从Linux3.0开始,Linux内核添加了Xen 相关的支
电BootLoader 启
上电
BootLoader
启动参数
Xen Hypervisor
Domain-0内核
电脑怎么装linux和windows双系统Domain-U内核
Domain-0根文件系统
Domain-U根文件系统
Domain-0应用程序
Domain-U 应用程序
Domain-0Kernel
hdprx
dhp
fdt
Xen Hypervisor
text+data+bss
U-Boot
0×85000000
0×84800000
0×84000000
0×83000000
0×80280000
0×80080000
0×80000000
hdprx
dhp
fdt
Kernel
U-Boot
0×84800000
0×84000000
0×83000000
0×80280000
0×80000000
……
--2
汽车技术
持,可以选择是否作为Domain-0内核使用,给内核编译带来不少方便。Domain-0内核修改过程如图4所示。
图4Domain-0内核修改过程
由于i.MX8系列处理器使用ARMv8架构,属于64位处理器,所以需要在内核配置前执行:$export ARCH=ARM64
上述代码将架构改为ARM64,并在内核根目录的/arch/arm64/configs下对默认配置文件defconfig进行修
改,调整是否为Domain-0的配置,将修改后的配置文件重命名为Dom0_defconfig、DomU_defconfig并保存,如是便可以在后续修改2个系统的内核时分别拥有对应的默认配置文件。进而执行:
$make Dom0_defconfig
则make脚本会读取Dom0_defconfig中的代码,对内核进行配置,并保存文件.config。该文件即内核在进行编译时参考的最终配置文件。
其中,关于Xen和Domain-0的部分重要配置如下:CONFIG_XEN_DOM0=y
CONFIG_XEN_DEV_EVTCHN=y CONFIG_XEN_SYS_HYPERVISOR=y CONFIG_XEN_BACKEND=y
CONFIG_XEN_NETDEV_BACKEND=m CONFIG_XEN_BLKDEV_BACKEND=m
以上即以Domain-0作为特权域必须的配置,能使Domain-0在启动时加载特权域相关组件,及组成Xen Hypervisor中分离驱动架构的必要部分——backend驱动。
配置结束后保存,然后对内核进行编译。本文使用的Linux内核加入了Yocto Project的支持,可以使用bitbake linux-imx-C compile指令一步完成内核编译和部署,之后会直接将编译生成的镜像文件Image和设备树.dtb文件保存于deploy目录下,方便查和使用。
3.2系统启动介质的制作
一个Linux系统的运行包含4个必需部分:Linux 系统内核Image、设备树.dtb文件、BootLoader、根文件系统。通过Yocto Project提供的bibake编译指令可在/tmp/deploy目录下生成单独的内核、文件系统等,也有将上述4个部分全部打包的镜像.sdcard文件,供开发人员制作启动介质,可以直接使用dd指令将打包好的完整系统镜像.sdcard文件烧录到SD卡中。但是使用这种固定的烧录镜像方法时,无论SD卡的存储空间多大,都会对SD卡进行固定大小的分区,且仅有2个分区。这会造成SD卡存储资源的浪费,且空间大小不可调节,若文件系统中放入大量应用程序,则会造成分区空间不足,但空余空间无法利用的后果。另外,由于使用Xen 虚拟化方案启动2个系统,则需要在一张SD卡上烧录2个系统,以上方法便不能适应此需求。
对上述结果进行分析,并结合Linux系统启动过程,本文手动对SD卡进行分区并格式化,根据需求自定义分区大小。此后,按地址前后顺序在SD卡上烧录U-Boot、在第1个分区放置设备树.dtb文件和系统镜像,在第2个分区放入根文件系统。后续空间为未分区或格式化的raw存储空间,仍可在后期增加分区和放置系统文件。
考虑到目前本课题实际需要,暂不涉及多系统的试验,因此对SD卡分为3个分区,如表1所示。
表1自定义SD卡分区情况
分区完成后需要进行格式化,第1个分区格式为vfat,用于存放设备树文件和内核镜像,第2、第3个分区格式为ext4,用于存放根文件系统。接下来分别完成单独烧录BootLoader、复制根文件系统等操作,即完成了启动介质的自定义制作。
经试验验证,该方法具有可行性,同时解决了无法烧录多个系统、SD卡空间浪费的问题。为提高SD卡内存使用率,在后续研究中将全部使用该方法。
完成SD卡启动介质制作后,将SD卡插入开发板卡槽,输入run xenmmcboot,即从SD卡中启动Xen Hypervi⁃sor。初始化Xen的一些资源后,内核开始启动Domain-0。4非特权域Domain-U设计与启动
4.1Domain-U内核配置与编译
Domain-U内核的配置过程与Domain-0类似,但在设备分配上有所不同。Domain-U的配置主要是内核模块与硬件设备的分配。Linux内核从3.x版本开始引入设备树的概念,用于实现驱动代码与设备信息的分离。
根据处理器类型调整内核架构编写配置文件Dom0_defconfig
使用make指令配置内核
使用bitbake指令编译内核
分区名称起点扇区编号终点扇区编号扇区数量/个分区容量
Id
类型
/dev/sdc1
20480
1024000
1003521
490MB
c
W95FAT32(LBA)
/dev/sdc2
1228800
16172544
14943745
7.1GB
83
Linux
/dev/sdc3
16377344
31116287
14738944
7GB
83
Linux
--3
2021年第4期
对于Linux双系统,需要编写2个系统分别对应的设备树.dts文件。而NXP公司对于单Linux系统已经编写了针对该开发板的设备树文件fsl-imx8qm-mek.dtsi,因此可以在此基础上进行修改。
设备树文件的修改原理如图5所示。根据Xen Hypervisor虚拟化方案的原理,Domain-0作为特权域拥有所有硬件资源的访问权,因此在Domain-0的设备树中理应包括所有的设备,但有些需要设置为“xen,passthrough”属性,传递给Domain-U供其重写属性并使用。本文完成了fsl-imx8qm-mek-dom0.dts和fsl-imx8qm-mek-domu.dts2个文件的编写,并在调试中进一步修正。
图5Xen资源分配方法
根据Domain-U的配置要求,对其内核配置make menuconfig时,将XEN_BACKEND设为n,即将与Xen有关的backend驱动全部关闭。此外,在启动过程中经常遇到启动Domain-U时部分模块启动异常而出现
致命错误,导致内核错误(kernel panic)的问题。以加密算法模块(Cryptographic Accelerator and Assurance Module,CAAM)为例,由于其需要直接与硬件通讯,而根据Xen 虚拟化方案,只有Xen Hypervisor工作在ring0时可以直接访问硬件,其他域的特权级均低于它。非特权域中的操作系统不能直接与硬件通讯,因此,在启动过程中CAAM模块会因不到硬件地址而出现野指针,从而导致内核出现错误,无法正常启动。
根据以上原因,需要把Domain-U中与硬件资源直接相关的配置删除,重新编译内核作为Domain-U的Image,以上便完成了Domain-U的内核配置。随后使用与编译Domain-0内核相同的方法完成Domain-U内核的编译。
4.2创建并启动Linux双系统
Xen Hypervisor将策略的制定和实施分离,将管理和配置工作交给Domain-0进行,而并非给Hypervisor实施。亦即若将虚拟机的管理工作分为2类,即确定如何管理和实施,则Domain-0负责第1类工作,Xen Hypervisor负责第2类。之后,Domain-U创建的过程即在Domain-0中对其配置进行设置,继而通过xl create、xl console等命令行指令进行创建。同理,用户在Domain-0中可以设置虚拟机的管理参数,而Xen Hypervisor按照在Domain-0中设置的参数设置并启动客户虚拟机。
根据以上分析,对于从Domain-0到Domain-U的启动,需要经过如图6所示的操作过程。
图6Domain-U的启动过程
其中重点在于需要编写/etc/xen/domu-im8qm-mek. cfg配置文件,对Domain-U进行配置。domu-im8qm-mek.cfg文件的主要内容包括:
kernel="/run/media/mmcblk1p1/Image_domU"#内核文件位置
device_tree="/run/media/mmcblk1p1/fsl-imx8qm-mek-domu.dtb"#设备树位置
disk=[′format=raw,access=rw,vdev=xvda,target=/ dev/mmcblk1p3′]#启动盘挂载点
cmdline="console=hvc0root=/dev/xvda" name="DomU"#系统名称
on_reboot="soft-reset"
memory="3584"#内存大小
vcpus=4#虚拟CPU数量
cpus=[′2′,′3′,′4′,′5′]#与物理CPU的硬件相关
该.cfg文件中对Domain-U的内存进行了设置,同时在U-Boot中也对内存资源进行了预分配。其中.cfg文件中指定最大内存容量,U-Boot中通过宏分配实际的内存地址空间大小。若U-Boot中分配的内存大于.cfg文件中配置的最大内存,则在创建过程中Domain-U正在使用的内存会超出最大允许范围,出现野指针导致系统跑飞,进而被Xen Hypervisor强制关闭。根据以上情况,对2处内存设置进行协调,完成Domain-U的创建。
本文使用xl create/etc/xen/domu-im8qm-mek.cfg的方法将配置要求传递给Xen Hypervisor,随后Xen Hypervisor进行资源分配,并创建Domain-U。xl create 方法流程图如图7所示。
将修改好的Domain-U内核镜像Image、Domain-U 设备树文件复制到SD卡中的第1个分区。随后在SD 卡中的第3个分区中装入Domain-U的根文件系统,将写好的Domain-U系统配置文件放在/etc/xen目录下。Domain-0系统启动后,进入到/etc/xen,然后执行
Domain-0
ldb1 ldb1_phy i2c1_lvds0
ldb2
ldb2_phy
i2c1_lvds1
Domain-U
ldb2
ldb2_phy
i2c1_lvds1
xen,passthrough
硬件资源(物理CPU、物理内存等)
上电
启动Domain-0
解析.cfg文件
使用xl指令创建虚拟机对象
传递参数给Xen Hypervisor
分配内存及硬件资源
启动Domain-U内核
--4
汽车技术
2021年
第4期
xl create domu-imx8qm-mek.cfg ,成功创建Domain-U 系统。随后执行xl console DomU 接入Domain-U 的控制,
完成双系统启动。
图7xl create *.cfg 创建客户虚拟机流程
为了方便区分2个系统,在用户名中把Domain-U 的root 用户名设置为guest 。登录Domain-U 后,可以回到特权域Domain-0,通过xl list 命令可以看到正在运行的2个虚拟机系统及其相关信息。
5双屏显示驱动设计
双屏显示驱动程序的开发过程中需要根据Xen Hypervisor 的驱动结构对一般的显示驱动进行前、后端分离。Xen 的虚拟设备架构采用前、后端分离的设备驱动结构。虚拟设备驱动包含Domain-U 中前端设备驱动
和Domain-0中后端设备驱动。后端设备驱动可以通过原生设备驱动访问真实的硬件设备,其架构如图8所示。
图8Xen 设备驱动架构
基于Xen 的虚拟驱动架构,本文完成了双屏显示所需的原生驱动程序、资源配置、设备节点分配、前后端驱动的所有设计与开发,最终完成了双屏显示的驱动程序设计,显示效果如图9所示。
(a )动画演示
(b )组合仪表演示
图9
双系统双屏显示
6结束语
本文在NXP 公司开发的基于i.MX8处理器的i.MX8QuadMax Mek 开发板上完成了虚拟化Xen 方案下的Linux 双系统设计,在i.MX8系列处理器上实现了Xen 虚拟化方案,验证了虚拟化方案在车载智能座舱系统上的可行性,是嵌入式虚拟化技术在车载智能座舱系统上使用的新尝试。在本文研究成果的基础上,未来可以进行进一步探索,如:开发系统间通讯机制,在2个系统之间提高数据传递速度;将Linux 系统升级为Android 系统,并在Android 系统中开发更加丰富的中控系统应用,最终真正应用于实际的车载智能座舱系统。
考文
[1]李仲龙,杨斌,孙林花.Xen 虚拟化技术研究[J].电脑知识与技术,2014,10(25):5887-5889.
LI Z L,YANG B,SUN L H.Research on Xen Virtual Technology[J].Computer Knowledge and Technology,2014,10(25):5887-5889.
[2]AVANZINI A,VALENTE P,FAGGIOLI D,et al.Integrating
Linux and the Real-Time ERIKA OS through the Xen Hypervisor[C]//IEEE International Symposium on Industrial Embedded Systems.IEEE,2015.
[3]ABENI L,FAGGIOLI D.Using Xen and KVM as Real-Time Hypervisors[J].Journal of Systems Architecture,2020,106:
36-42.
[4]黄福睿.基于ARM 和Windows Embedded CE 6.0的嵌入式车载系统的设计及研究[D].沈阳:沈阳理工大学,2011.HUANG F R.The Research and Design of Vehicle System Based on ARM and Windows Embedded CE 6.0[D].Shenyang:Shenyang Ligong University,2011.
[5]邓宗权,蒋向东,王继岷,等.基于嵌入式Linux 汽车智能仪表系统的设计[J].微型机与应用,2014,33(4):26-28.
DENG Z Q,JIANG X D,WANG J M,et al.Design of Automotive Intellectual Control Meter System Based on Embedded Linux System[J].Information Technology and Network Security,2014,33(4):26-28.[6]王冲.基于嵌入式的半虚拟化应用系统的研究与实现[D].成都:西南交通大学,2014.
WANG C.Research and Implementation of Application System Paravirtualization Based on Embedded[D].Chengdu:Southwest Jiaotong University,2014.
(责任编辑
畔)
修改稿收到日期为2020年8月4日。
xl create *.cfg main_create
(int argc,char **argv)int create_domain
(struct domain_create domain_info)
解析参数
domain_info.debug;domain_info.daemonize;itor;domain_info.paused;domain_info.dryrun;domain_info.quiet;domain_info.vnc;
domain_info.vncautopass;
sole_autoconnect;
libxl_domain_create_new (*ctx,*d_config,*domid,*ao_how,
aop_console_how)do_domain_create
(*ctx,*d_config,*domid,restore_fd,send_back_fd,*params,*ao_how,
aop_console_how)initiate_dormain_create(*egc,*dcs)在xenstore 中写入Domain-U 的基本信息,分配之间通道、共享页面xenstore 创建新的domain 管理对象
完成Domain-U 启动
Domain-0Guest App
Guest OS 原生设备驱动
后端设备
驱动Backend Domain-U Guest App Guest OS
前端设备驱动Frontend
Xen Hypervisor
vcpu
虚拟mmu
事件通道
硬件接口
硬件资源(物理CPU 、物理内存等
-
-5