进入和退出例外模式
在真实系统中,模式之间的切换比我们的实例更复杂一些。ARM 总结了 ARMv8-A 架构的行为并在参考手册中给出。手册中介绍,只有在接到例外或从例外返回时,才能改变执行所处的例外等级。在接到例外时,例外等级只能升高或保持不变;在从例外返回时,例外等级只能降低或保持不变。只有三个指令能生成针对下个例外等级的例外:SVC (Supervisor Call),生成针对 EL1 的例外;HVC (Hypervisor Call),生成针对 EL2 的例外;SMC (Secure Monitor Call),生成针对 EL3 的例外。这些指令取值范围为 0-65,555,允许每个例外等级有 216 个系统调用。这些指令针对下个例外等级,而且是唯一可供运行在较低例外等级的程序从运行在较高例外等级的程序请求某些内容的机制。在我们的理论实例中,SVC 是 SWITCHSUPER,HVC 是 SWITCHHYPER。
PetaLinux 工具包含一组命令,以供用户在赛灵思 FPGA 和 SoC 上轻松创建和扩展 Linux 系统。
在前一个部分,我们介绍了能够让运行在 USER 模式(EL0)的程序进入 SUPER 模式 (EL1) 的事件。大多数运行在 USER 模式的程序生成的事件是请求存储器。当运行在 EL0 中的用户空间程序从运行在 EL1 中的 OS 请求存储器时,这个用户空间程序的 C 代码可能调用函数 malloc(),再由该函数调用 mmap() 或 sbrk(),以从 OS 请求一个指向可用存储器的指针。在 ARMv8-A 架构中的 Linux 上,这个过程在幕后转化为 SVC 系统调用。该系统调用会把处理器转换为 EL1,从而将控制权送回 OS,后者会解读调用内容并提供正确的响应——本例中是指向所请求存储器区域的指针,或者是一个错误,用以指出没有可用存储器。
演示创建和工具
现在我们来介绍我们团队在 Zynq UltraScale+ QEMU Model 上运行 Doom 时所采用的步骤。这些步骤展示了如何获得和构建运行演示所需的每个组件,如何运行以及以什么顺序运行每个组件,以及如何与演示交互。成功完成该演示之后,你会获得一个环境,用来在上面进行实验,以了解 Xen 管理程序在仿真的 Zynq UltraScale+ MPSoC 上的运行情况。还需要将此迁移植 Zynq UltraScale+ MPSoC 芯片,这可作为练习由用户来完成。
想玩 DOOM 吗?
为了让过程更简单,赛灵思提供基础的根文件系统,这样用户就无需花时间和精力自己构建。此演示所需的所有下载内容在以下网址中均有提供: inx.com/Doom+on+Xen+Demo。
该演示首先通过更新由赛灵思提供的预编译根文件系统 (rootFS),可包含所需的组件。然后,利用赛灵思的 PetaLinux 工具运行演示。rootFS 包含运行于 Linux 系统上的大部分程序——具体来说就是用来启动系统的一组脚本,以及用来实现系统的应用程序与函数库集。我们用来扩展演示中的基础 rootFS 所使用的两个工具分别是 Buildroot 和 PetaLinux。我们使用 Buildroot 为赛灵思提供的基础 rootFS 构建 Doom 二进制文件,同时使用 PetaLinux 创建 rootFS 的剩余部分并引导演示。
Buildroot
Buildroot 是一个简单的构建系统,用于为 Linux 系统创建 rootFS。它使用 make menuconfig 接口,这是一个用来配置 Linux 内核本身的常用方法。Buildroot 包含对 PrBoom 的默认支持,这对于本演示很有帮助。(PrBoom 是我们所使用的 Doom 游戏的 GNU 通用公共许可证 [GPL] 版本。这里我们会穿插使用 PrBoom 和 Doom 这两个术语。 )Buildroot 对 Xen 构建不提供本地支持(尽管它可创建用于构建 Xen 所需的所有库和工具链),因此赛灵思提供 Xen、Xen 工具和为用户预编译的 Xen 库以及其他一些所需的库,以让过程简单直观。
PetaLinux
PetaLinux 工具包含一个命令集,以便让用户在赛灵思 FPGA 和 SoC 上轻松创建和扩展 Linux 系统。该演示使用 petalinux-build 和 petalinux-boot 命令。petalinux-build 命令用于创建全部所需的组件。petalinux-boot 命令(外加几个变量)用于启动在 QEMU 仿真器上运行的所有组件。介绍 PetaLinux 工具中的所有命令超出了本文的范围,但是通过此演示系统应该很容易发掘这两个命令和其他命令的功能。参考PetaLinux 工具文档 — 参考指南 UG1144 (v2015.4) 了解更多信息。
项目先决条件
该项目需要一个运行 Linux 的工作站或虚拟机,具有满足 UG1144 (v2015.4) 中所列的 PetaLinux 工具安装要求的环境,而且环境中需要安装赛灵思 PetaLinux Tools v2015.4 版本。
一旦 Doom 启动,你就可以使用键盘和鼠标控制游戏。应记住,可能需要点击 ESC 键来开始游戏。开始游戏咯!
步骤 1:构建 ROOTFS
首先,我们需要构建 rootFS。从赛灵思下载 doom_demo.tar.gz,打开下载目录中的一个 terminal;你可在以下网址中找到全部所需文件: +on+Xen+Demo。我们将该目录称为 。
解压文档。
$ cd
$ tar -xzf doom_demo.tar.gz && cd doom_demo
我们会看到一个文件夹,我们将把它存到根文件系统(一个用于 Dom0,另一个用于 DomU)。现在,我们需要构建 PrBoom,并复制到 rootFS。
首先,需要下载 Linux 内核,这样我们随后就可以构建 rootFS。我们使用 v4.3 标签。
$ git clone -b v4.3 https://github.com/tor- valds/linux.git
下载 Buildroot 源文件,并更改到 Buildroot 目录。
$ git clone https://git.buildroot.net/buildroot && cd buildroot
现在我们需要配置 Buildroot,以构建可以使用的套件。
$ make menuconfig
我们选择以下选项:
Target options ---> Target Architecture ---> AArch64 (little endian)
Target packages —> Games ---> prboom ---> [*]
Target packages —> Games ---> shareware Doom WAD file ---> [*]
应自动选择全部所需的库。
$ make # (这需要几分钟时间,取决于机器。)
现在,我们将所有 PrBoom 相关文件复制到 targetfs 目录,确保我们在 buildroot 目录下的 ./output/target/ 目录。
$ for i in $(find ./-name ‘*oom*’); do cp ${i}
/doom_demo/targetfs/${i}; done
现在,我们完成了 Buildroot 操作。我们移到上一个目录 doom_demo 目录。
$ make # Build the host and guest rootFS.(这需要几分钟时间,取决于你的机器。)
注意:可能还存在额外配置选项,这主要取决于使用的内核版本。这些额外配置选项未被我们提供的配置预先选择。使用默认选项即可(需点击回车键)。
步骤 2:构建基础设置
接下来,我们为平台构建嵌入式系统软件的剩余部分,包括引导装载程序、ARM Trusted Firmware (ATF)、Linux 内核和设备树。赛灵思的 PetaLinux 工具让这个过程简单直观。我们创建一个针对赛灵思 ZCU102 开发板的 PetaLinux 项目。参考 2015.4 UG1144 和 AR#66249 中 QEMU 和 MPSoC PetaLinux 的快速入门材料。访问china.xilinx.com ,将 ZCU102 BSP (板支持包)下载到
目录下。
$ cd
$ petalinux-create --type project -s
/ Xilinx-ZCU102-v2015.4-final.bsp -- name doom_demo_zynqMP
这样将在 /doom_demo_zynqMP 中创建我们的 PetaLinux 项目。
我们转到 PetaLinux 项目,并构建 PetaLinux。
$ cd /doom_demo_zynqMP
$ petalinux-build
现在,我们需要为本用例手动编辑设备树。
编辑 xen-overlay.dtsi 文件 (subsystems/linux/ configs/device-tree/xen-overlay.dtsi)。
将 dom0 下的 'reg = <0x0 0x80000 0x3100000>;' 替换为 'reg = <0x0 0x80000 0x4100000>;'
将 dom0 下的 'xen,xen-bootargs = "console=dtuart dtuart=serial0 dom0_mem=512M bootscrub=0 maxcpus=1 time r_ slop=0";' 替换为 'xen,xen-bootargs = "console=dtuart dtuart=serial0 dom0_mem=512M bootscrub=0 maxcpus=4 timer_ slop=0";'
将 dom0 下的 'xen,dom0-bootargs = "console=hvc0 earlycon=xen earlyprintk=xen maxcpus=1";' 替换为 'xen,dom0-bootargs = "rdinit=/bin/sh console=hvc0 earlycon=xen earlyprintk=xen maxcpus=4";'
编辑 zynqmp.dtsi 文件 (subsystems/linux/configs/ device-tree/zynqmp.dtsi)。
将 dom0 下的 'compatible = "cdns,uart-r1p12";' 替换为 'compatible = "cdns,uart-r1p8", "cdns,uart-r1p12";' 现在,手动构建 Xen 设备树。
$ dtc -I dts -O dtb -i ./subsystems/linux/con- figs/device-tree/ -o ./images/linux/xen.dtb ./ subsystems/linux/configs/device-tree/xen.dts
最后,我们需要将 Peta- Linux 构建的 rootFS 替换为我们此前构建的 rootFS。之所以这样做,是因为 PetaLinux 不包含 PrBoom,因为我们提供自己的 rootFS。我们还需要将 xen.ub 镜像替换为赛灵思预先构建的镜像,因为 Xen 和 Xen 工具版本必须匹配。
$ rm /doom_demo_zynqMP/images/linux/ Image && rm /doom_demo_zynqMP/images/ linux/xen.ub
$ cp /doom_demo/Image /doom_ demo_zynqMP/images/linux/Image && cp / doom_demo/xen.ub /doom_demo_zynqMP/im- ages/linux/xen.ub
使用 u-boot 引导加载程序引导。
$ petalinux-boot --qemu --u-boot --qemuargs= "- net nic -net nic -net nic -net nic -net us- er,net=192.168.129.0,dhcpstart=192.16 8.129.50,host=192.168.129.1,hostfwd=t cp:127.0.0.1:5900-192.168.129.50:5900"
> setenv serverip 192.168.129.1
> tftpb 4000000 xen.dtb; tftpb 0x80000 Image; tftpb 6000000 xen.ub; bootm 6000000 - 4000000
# /boot.sh
# /xen-doom.sh 1
步骤 3:开始演示
现在,我们可以打开虚拟网络计算 (VNC) 查看器,并在运行 QEMU 的机器上连接 localhost:5900 以观看 Doom 游戏。(注意:以上命令行只能重定向 5900 端口,因此当开始演示时只能连接到第一个 Doom 实例。如果想连接多个实例,需要为 QEMU 添加更多 hostfwd 变量,并连接到下个可用的端口[5901 用于下个实例,5902 用于第三个实例,以此类推],然后将这些实例连接。)
一旦 Doom 启动,你就可以使用键盘和鼠标控制游戏。应记住,可能需要点击 ESC 键来开始游戏。还应记住,你已经很长时间没玩 Doom 游戏了,因此你可能走不了多远。 别气馁。使用自己构建的系统绝对“可行”。
XEN 深入探讨
正如“Zynq MPSoC 获得 Xen 管理程序支持”(赛灵思中国通讯,第 93 期)中所介绍, Type 1 管理程序在本机硬件上运行,Type 2 管理程序不是软件的最底层,而是托管在 OS 上。Xen 属于 Type 1 管理程序(图 4)。
图 4:作为 Type 1 管理程序,Xen 在本机硬件上运行,虚拟机在 Xen 之上运行
以前,我们提到了虚拟处理器(也称虚拟机)。在 Xen 中,这些被称为域。特权最高的域被称为 Dom0;无特权的客户域是 DomU 域。
Dom0 是 Xen 管理程序在引导时创建的初始域。它是特权域,并驱动平台上的设备。Xen 将 CPU、存储器、中断和定时器虚拟化,为虚拟机提供一个或多个虚拟 CPU、系统存储器的一部分、一个虚拟中断控制器和一个虚拟定时器。除非配置为其他方式,否则 Dom0 可直接访问所有设备并驱动它们。Dom0 还运行一组名为半虚拟化 (PV) 后端的驱动,为无特权虚拟机提供对磁盘、网络等设备的访问权。Xen 提供用于发现和初始通信设置的所有工具。作为 DomU 的 OS 通过运行相应的 PV 前端驱动程序来获得对一组通用虚拟设备的访问权。根据 DomU 的数量,单个后端可服务多个前端。有一对适用于所有最常见设备类型(磁盘、网络、控制台、帧缓冲器、鼠标、键盘等)的 PV 驱动程序。PV 驱动程序通常位于 OS 内核(即 Linux)中。几个 PV 后端也可以在用户空间中运行,通常在 QEMU 中。前端在存储器的共享页上使用简单的环协议连接后端。从 Dom0 与管理程序交互要求程序使用定义的管理程序调用(类似于系统调用)。Xen 提供一个名为 Xen Tools (也可写成 xen-tools)的、带有库的参考工具箱。xen-tools 包含一个名为 xl 的程序,该程序可与其他程序一起检查状态和创建客户机。
利用设备半虚拟化,可在管理程序与客户机之间就如何进行通信达成协议。常见的通信协议为 Xen Bus 和 VirtIO。
xl 中的“create”命令要用到描述客户机的配置文件,如果配置文件规定客户机需要一个由 VNC 会话支持的虚拟帧缓冲器 (VFB),那么 xl 会在 Dom0 用户空间中自动启动虚拟化代码(本演示中,为每个客户机启动一个)。
评论
查看更多