X86 可以虚拟化并运行Linux内核的最简单架构

X86 可以虚拟化并运行Linux内核的最简单架构,x86,arm,emulation,virtual-machine,X86,Arm,Emulation,Virtual Machine,我受到了Fabrice Bellard实现的启发,我想尝试编写能够运行Linux内核的最简单的虚拟机。这是一项纯粹的教育工作,除了理解和分享使之成为可能的代码之外,没有其他目的 浏览了一遍之后,我怀疑我可能会陷入困境,试图编写一个能够模拟完整x86指令集的虚拟机。相反,我正在寻找一个更简单的架构,我可以尝试模仿 我已经通读了关于如何模拟x86体系结构的内容,答案建议从更简单的东西开始,比如ARM体系结构。我的问题更具体:我可以尝试模拟的最简单的架构是什么,它将能够运行Linux内核? 我感兴趣的

我受到了Fabrice Bellard实现的启发,我想尝试编写能够运行Linux内核的最简单的虚拟机。这是一项纯粹的教育工作,除了理解和分享使之成为可能的代码之外,没有其他目的

浏览了一遍之后,我怀疑我可能会陷入困境,试图编写一个能够模拟完整x86指令集的虚拟机。相反,我正在寻找一个更简单的架构,我可以尝试模仿

我已经通读了关于如何模拟x86体系结构的内容,答案建议从更简单的东西开始,比如ARM体系结构。我的问题更具体:我可以尝试模拟的最简单的架构是什么,它将能够运行Linux内核?


我感兴趣的是完全模拟整个机器,而不是简单地将指令传递回主机(例如,如果我正在编写x86仿真器,这是可能的)。我有相当数量的16位汇编知识,以及一些操作系统理论背景,所以这应该是足够的工作范围内

Linux内核支持的体系结构列表:

“最简单的可能”有些主观,但以下是我认为不太复杂的列表:

  • MIPS
  • H8(μClinux)
  • 68k/冷铁(μClinux)

您可以看看microBlaze,一种专为在FPGA上高效实现而设计的处理器。 它只有两种指令格式和32个主操作码值

Xilinx对其FPGA产品线进行了定义和支持。参考文件位于:

从易于实现的角度来看,可能最简单的架构。由于您正在构建一个完全模拟机器的仿真器,因此无论哪一个具有最简单的指令集设计/体系结构,都是合适的。RISC架构无疑更好。但是选择一个没有被广泛使用的架构也是不好的,如果您需要支持,很少有人能够帮助您。编写模拟器绝非易事。我想说,要么选择ARM,要么选择MIPS,两者都很流行:

您还必须知道,Fabrice Bellard的javascript虚拟机使用32位x86兼容CPU,这是Linux本机支持的。您必须自己为ARM或MIPS移植linux内核(使用工具链)。请参阅有关如何使用linux内核的链接

对于MIPS:

对于ARM:


正如我在评论中所说,我将平衡三个方面:

  • 简单的指令集(很少的指令格式,很少的操作码:任何与x86不同的东西)
  • 文件:广泛提供。这意味着可能会放弃一些简单的体系结构,将精力集中在广泛支持的体系结构上(例如,x86在这里获胜,但您也可以从学术界找到很多关于RISC的资料,尤其是MIPS)。或者去买开放的东西,比如
  • 在“内核模式”下易于使用。在特权、内核模式中,有一个全新的寄存器、指令和内部的世界需要考虑。不要忘记处理器也有总线,简单的处理器可能有非常复杂的总线!你也需要效仿。或者,如果你对它感到满意,你可以选择它

最后,我想提出一些“古老”的建议:相当简单,特别是在特权模式下,经过充分研究和记录。例如,原始的MIPS、摩托罗拉68k系列或接近原始RISC()的产品,如果有Linux版本的话

(+1)您需要一个用于该体系结构的gcc后端,对吗?由于Linux主要是C,我想你也在问gcc可以支持的最简单的后端是什么。你可以模拟一个Atmega micro并运行这个:但这可能是一个级别的模拟太远了:)也可以研究QEMU(),谁知道你最终可能会创建一个新的模拟架构。
ARM
有一个简单的指令集。然而,更难实现
虚拟化的部分将是MMU。您可以不使用MMU进行配置,也可以使用准虚拟化Linux。如果您使用的是普通Linux,则需要模拟许多ARM
协处理器
寄存器。除了指令集之外,还需要考虑其他方面:特殊寄存器、MMU、TLB,以及通常在用户模式下看不到的所有内容,但您可以(并且将)在内核模式下使用RISC和RISC。例如,PowerPC是“RISC”,但其指令集远未“缩减”。ARM的指令集现在也相当复杂,但MIPS仍然相当简单。+1用于在简单性和可用资源之间取得平衡。但除了指令集,还有另一个方面需要考虑:特殊寄存器、MMU、TLB,以及通常在用户模式下看不到的所有内容,但您可以(并且将)在内核模式下使用为什么需要模拟总线?这对内核来说肯定是透明的吗?@RichardKeller有些部分是透明的,有些部分不是。内核还需要处理I/O,这意味着,例如,与可编程中断控制器交互,直接I/O和/或DMA。。。