赛灵思和 DornerWorks 的体系软件团队在赛灵思的 Zynq® Ultrascale+™ MPSoC 上发动 Xen Project 办理程序时,咱们发现可经过运转当年叱诧一时的盛行电子游戏 Doom 来演示和测验体系。
神马?!你不知道 DOOM??(CS 你总知道吧 -__-||)
怎么针对 Zynq UltraScale+ MPSoC 经过 QEMU 在 Xen 上运转 Doom 呢,在具体介绍具体进程之前,咱们先来了解什么是办理程序,以及它们怎么与 Zynq UltraScale+ MPSoC 上的处理器协同作业。
办理程序及其作业原理
办理程序是一种可虚拟化处理器的计算机程序。运转在虚拟化处理器上的运用程序和操作体系好像彻底具有体系,但事实上办理程序担任办理虚拟处理器对物理机资源(例如存储器和处理内核)的拜访。办理程序之所以盛行,是因为能完结规划分区以及体系上运转的独立软件元素之间的阻隔。
为了支撑虚拟化,物理处理器有必要供给一个供办理程序运转的特别”形式”。因而,介绍处理器形式有助于了解办理程序怎么完结处理器魔法。
一切处理器都有一些指令,这些指令可操作寄存器中存储的值,并可读写存储器。处理器的形式是指令和寄存器的调集,以及运用指令拜访寄存器和存储器时要恪守的规矩。为了便于解说,咱们以通用途理器为例来介绍,并运用与结构无关的术语。在这个实例中,处理器具有特定的寄存器、指令和形式。寄存器包括 RegisterA、RegisterB、RegisterC、UserProgramCounter、Register-Super 和 SuperProgramCounter。指令包括以下内容。
· ADD Register3 Register1 Register2 将 Register1 与 Register2 相加,并把成果存入 Register3,即 Register3 = Register1 + Register2。
· MOVTO Register2 Register1 将 Register1 中地址所指向的存储器内容移动到 Register2。
· MOVFROM Register2 Register1 将 Register1 的内容移动到 Register2 中地址所指向的存储器。
· ENTERSUPER 进入处理器的 SUPER 形式。
· EXITSUPER 退出 SUPER 形式并进入 USER 形式。
在 USER 形式下,处理器的指令的功用受到限制。本例中,指令可对除 RegisterSuper 和 SuperProgramCounter 以外的一切寄存器进行读和写操作,处理器可履行除 EXITSUPER 以外的一切指令。
此外,在 USER 形式下,一切指令只能读和写一部分存储器,例如从地址 0x0000_0100 到 0x0FFF_FFFF。在 USER 形式下,假如程序测验履行不应该履行的指令,或许拜访无权拜访的寄存器或存储器方位,那么处理器将暂停犯错指令 (offending instruction)。
SUPER 形式下,处理器的指令可以读/写上述一切寄存器,包括 RegisterSuper 和 SuperProgramCounter。以上所列的一切指令,包括 EXITSUPER,都可以履行,别的,附加的指令 ENTERHYPER 也可履行(后边具体介绍该指令)。此外,在 SUPER 形式下,指令可以拜访体系中的悉数存储器(从 0x0000_0000 到 0x7FFF_ FFFF)。
选用带形式的处理器,使咱们可以运用规划分区来更简略地处理软件工程规划问题。以上实例中,只要一种办法进入 SUPER 形式:履行 ENTERSUPER 指令。相同,只要一种办法退出 SUPER 形式:履行 EXITSUPER。此外,在 USER 形式下程序只能拜访机器的部分存储器。有了这种计划,咱们可编写一个程序让处理器一起运转多个 USER 形式程序。这个”操作体系”(OS) 程序运转在 SUPER 形式,并办理在 USER 形式中运转的程序。
当 OS 运转时,会检查需求运转的一切 USER 形式程序,挑选一个运转,然后运用 EXITSUPER 这样的指令告诉处理器切换到 USER 形式以运转程序。所选的程序会一向运转,直到有事情导致处理器切回 SUPER 形式。这类事情可所以来自 USER 形式程序的 ENTERSUPER 指令,或外部事情,例如定时器,它可以不提示正在 USER 形式下运转的程序将处理器切换到 SUPER 形式。不管切换怎么产生,每逢事情产生时,咱们都可构建 OS 以依据相应战略相继挑选和运转程序。当切换快速进行时,用户以为 USER 程序一起运转。
USER HYPER 形式的用途是让许多 SUPER 程序运转。SUPER 形式下的每个程序都可所以 OS;这些 OS 自身会让许多 USER 程序并行运转。
SUPER 处理器形式还能避免 USER 程序搅扰运转在 SUPER 形式的程序或其他 USER 形式程序。USER 形式程序的任何过错或违规都可被操控在该程序自身的实例中,不会损坏或搅扰为 SUPER 形式操作保存的体系存储器和寄存器。
听起来很好,但能否用另一个形式完结一些功用?
对咱们的机器稍加扩展,就可以引进 HYPER 形式。HYPER 形式可以读/写一切初始寄存器(RegisterA、RegisterB、RegisterC、UserProgramCounter、RegisterSuper 和 SuperProgramCounter)以及两个附加寄存器:RegisterHyper 和 HyperProgramCounter。HYPER 形式下的指令包括初始集以及下面的斜体字。
ADD Register3 Register1 Register2 将 Register1 与 Register2 相加并把成果放在 Register3 中,即 Register3 = Register1 + Register2。
· MOVTO Register2 Register1 将 Register1 中地址所指向的存储器内容移到 Register2。
· MOVFROM Register2 Register1 将 Register1 的内容移到 Register2 中地址所指向的存储器。
· MOVTOPHYS Register2 Register1 将 Register1 中物理地址指向的存储器内容移到 Register2。
· MOVFROMPHYS Register2 Register1 将 Register1 的内容移到 Register2 中地址指向的物理存储器。
· ENTERSUPER 进入处理器的 SUPER 形式。
· EXITSUPER 退出 SUPER 形式并进入 USER 形式。
· ENTERHYPER 进入处理器的 HYPER 形式。
· EXITHYPER 退出处理器的 HYPER 形式。
· SWITCHSUPER RegisterHyper 切换到 SUPER 程序,该程序将运用 RegisterHyper 中的值来履行下一个 SUPER 程序。
HYPER 形式中的附加指令和寄存器答应处理器切换哪个程序在 SUPER 形式中运转,就像 SUPER 形式答应处理器切换哪个程序在 USER 形式中运转相同。HYPER 形式的一个特性是可以切换哪个存储器 SUPER 形式能看到;当一个在 HYPER 形式中运转的程序履行 SWITCHSUPER RegisterHyper 时,底层存储器彻底断开。这便是说当 HYPER 形式中的程序履行了 EXITHYPER 之后,下个 SUPER 程序运转之时,SUPER 形式看到的实践物理存储器与运转在 SUPER 形式中的另一个程序运用的物理存储器不同。SUPER 形式程序仍运用相同地址拜访存储器,可是该地址指向不同的物理方位。图 1 显现了履行 SWITCHSUPER RegisterHyper 前后的处理器存储器视图。
HYPER 形式很有用,是因为它答应许多个 SUPER 程序运转。SUPER 形式中每个程序都可所以 OS;这些 OS 自身可以让许多 USER 程序并排运转.这意味着,咱们可以在相同硬件上运转多个 OS,例如 Windows 和 Linux;在一个处理器上运转 20 个 Linux 实例;或许之间的恣意组合。因为每个虚拟 OS 实例无法看到另一个 OS 实例,因而假如一个溃散,不会使另一个实例也溃散。HYPER 形式的特性还有其他运用:咱们可以在多个 OS 之间对体系资源分区;监测 HYPER 形式下每个 OS 的履行,以在溃散时重启;以及在虚拟 OS 运转时亲近重视体系状况。
图 1:HYPER 形式下履行 SWITCHSUPER RegisterHyper 的前后差异
跟着处理器从 USER 切换到 SUPER 形式,再从 SUPER 切换到 HYPER 形式,机器会赋予履行代码更多特权。本例中,USER 形式程序只要权运用四个寄存器(RegisterA、RegisterB、RegisterC 和 UserProgramCounter)和四个指令:(ADD、MOVTO、MOVFROM和ENTER-SUPER)。此外,USER 程序只能读写 0x0000_0100 至 0x0FFF_ FFFF 的存储器。一旦进入 SUPER 形式,处理器答应指令与 RegisterSuper 和 SuperProgramCounter 对话,并答应履行 EXITSUPER 和 ENTERHYPER。此外,SUPER 程序可以拜访从 0x0000_0000 至 0x7FFF_FFFF 的存储器。
终究,一旦处理器进入 HYPER 形式,其指令就可以操作 RegisterHyper 和 HyperProgramCounter,并且程序可履行 SWITCH-SUPER 和 EXITHYPER。
图 2:各种形式如环形所示
HYPER 形式还答应处理器读写一切虚拟存储器,0x0000_0000 至 0xFFFF_FFFF,以及读写实践物理存储器。这些特权等级一般被直观地用环形来描绘(图 2)。主环,即 HYPER 环为特权等级较低的环赋予权限,终究可操控整个体系。
理论结合实践
ARM® 创立处理器规划,供 ARM 合作伙伴构建芯片用。ARM 处理器包括一个或多个内核。每个内核完结一个 ARM 架构。例如,Zynq UltraScale+ MPSoC 包括一个 ARM Cortex™-A53 处理器及四个 ARMv8-A 物理内核(图 3)。
当检查 ARM 处理器的文档和代码时,这种差异很重要;为了全面了解具有一个 ARM 内核的”芯片”,可参看有关架构 (如 ARMv8-A) 和处理器 (如 Cortex-A53) 的文档。ARMv8 架构中有四个破例等级 (来历:ARM 架构参看手册,D1-1404):
1、破例等级 0 (EL0),无需特权即可履行;
2、破例等级 1 (EL1),履行 OS 以及任何履行特权指令的内容;
3、破例等级 2 (EL2),答应硬件被虚拟化;以及
4、破例等级 3 (EL3),答应在安全与非安全处理器状况之间切换。
以下程序一般在这些形式下运转,如ARM 架构参看手册 (D1–1404)中所述:EL0,运用程序;EL1,OS 内核以及一般所描绘的相关特权函数;EL2,办理程序;EL3,安全监控器。咱们的理论实例直接对应 ARMv8 履行形式 EL0 至 EL2:USER 对应 EL0,SUPER 对应 EL1,HYPER 对应 EL2。ARM 添加第四个特权等级,即 EL3;运用这个特权等级,咱们可在安全与非安全环境之间切换 EL0 和 EL1。虽然 EL3 的运用是一个很重要的论题,可以为架构添加很多的功用,可是在本实例中咱们将其疏忽,并侧重介绍 EL0-EL2(运用办理程序的虚拟化)。假如对计算机怎么维护金融交易感兴趣,可以参看 ARMv8 EL3 文档(免费供给,需注册)。这是非常好的参看文档,从中可以取得极为具体的介绍。
图 3:Zynq UltraScale+ MPSoC 架构
进入和退出破例形式
在实在体系中,形式之间的切换比咱们的实例更杂乱一些。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 吗?
为了让进程更简略,赛灵思供给根底的根文件体系,这样用户就无需花时间和精力自己构建。此演示所需的一切下载内容在以下网址中均有供给: www.wiki.xil- 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;你可在以下网址中找到悉数所需文件: www.wiki.xilinx.com/Doom+on+Xen+Demo。咱们将该目录称为 。
解压文档。
$ cd
$ tar -xzf doom_demo.tar.gz cd doom_demo
咱们会看到一个文件夹,咱们将把它存到根文件体系(一个用于 Dom0,另一个用于 DomU)。现在,咱们需求构建 PrBoom,并复制到 rootFS。