微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > FPGA和CPLD > 在 Zynq MPSoC上运行 Doom 游戏

在 Zynq MPSoC上运行 Doom 游戏

时间:08-02 来源:互联网 点击:
通过这篇有趣的教程,熟悉运行在赛灵思 Zynq UltraScale+ MPSoC 上的 Xen 管理程序

作者:Zach Pfeffer
赛灵思公司嵌入式软件开发总监
zachp@xilinx.com

Edgar Iglesias
赛灵思公司高级主任软件工程师
edgari@xilinx.com

Alistair Francis
赛灵思公司软件工程师
alistai@xilinx.com

Nathalie Chan King Choy 赛灵思公司主任软件工程师
nathalie@xilinx.com

Rob Armstrong Jr.
赛灵思公司嵌入式专家现场应用工程师
ra@xilinx.com

赛灵思和 DornerWorks 的系统软件团队在赛灵思的 Zynq Ultrascale+ MPSoC 上启动 Xen Project 管理程序时,我们发现可通过运行 1993 年的流行电子游戏 Doom 来演示和测试系统。这款射击游戏使团队可以探讨 Xen 工程设计话题,以求将知识和经验传授给以后的管理程序使用者。

我们团队使用适用于 QEMU (开源 Quick Emulator)的 Zynq UltraScale+ MPSoC 仿真模型为软件进行 Doom 演示做好准备,当芯片到达时,只需数小时就能启动运行,不再需要等上数天。

如何针对 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 程序同时运行。

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 运行时密切关注系统状态。

随着处理器从 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。


图 1 — HYPER 模式下执行 SWITCHSUPER RegisterHyper 的前后区别

HYPER 模式还允许处理器读写所有虚拟存储器,0x0000_0000 至 0xFFFF_FFFF,以及读写实际物理存储器。这些特权等级通常被直观地用环形来描述(图  2)。主环,即 HYPER 环为特权等级较低的环赋予权限,最终可控制整个系统。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top