一种基于Rust的多核RISCV-CPU模拟器

文档序号:1798540 发布日期:2021-11-05 浏览:20次 >En<

阅读说明:本技术 一种基于Rust的多核RISCV-CPU模拟器 (Multi-core RISCV-CPU simulator based on Rust ) 是由 徐君 蒋旭 伍楷舜 于 2021-06-25 设计创作,主要内容包括:本发明公开了一种基于Rust的多核RISCV模拟器。该模拟器包括Risc-V处理核心模块、总线模块、DRAM模块、CLINT模块、PLIC模块和UART模块,其中Risc-V处理核心模块设置为多个,并基于Risc-V开源指令集构造,用于实现取指令,译码和执行功能;DRAM模块用于模拟内存;PLIC模块用于模拟硬盘;UART模块用于模拟外部中断或本地中断;总线模块与用于控制Risc-V处理核心模块、总线模块、DRAM模块、CLINT模块,PLIC模块和UART模块之间的信息交互,以实现无冲突通信。本发明提供的模拟器利用Rust语言强调安全,内存布局控制和并发的特性,提高了模拟器运行时的内存安全性,并且鲁棒性强。(The invention discloses a multi-core RISCV simulator based on Rust. The simulator comprises a plurality of Risc-V processing core modules, a bus module, a DRAM module, a CLINT module, a PLIC module and a UART module, wherein the Risc-V processing core modules are constructed based on a Risc-V open source instruction set and used for realizing the functions of instruction fetching, decoding and execution; the DRAM module is used for simulating a memory; the PLIC module is used for simulating a hard disk; the UART module is used for simulating external interruption or local interruption; the bus module is used for controlling information interaction among the Risc-V processing core module, the bus module, the DRAM module, the CLINT module, the PLIC module and the UART module so as to realize conflict-free communication. The simulator provided by the invention emphasizes the characteristics of safety, memory layout control and concurrency by using the Rust language, improves the memory safety during the running of the simulator and has strong robustness.)

一种基于Rust的多核RISCV-CPU模拟器

技术领域

本发明涉及计算机技术领域,更具体地,涉及一种基于Rust的多核RISCV-CPU模拟器。

背景技术

RISC-V是一种基于精简指令集计算原理建立的开放指令集架构,RISC-V结构简单,基础指令集只有40多条,加上其他的模块化扩展指令总共几十条指令。由于RISC-V具有完全开源、架构简单、易于移植等优点,使得其近期被大量使用。

Rust语言是一种专注于安全的系统编程语言,主要特征是运行速度快和内存安全。Rust通过所有权模型和类型系统保证了内存和线程的安全,使其能够在编译时消除内存相关错误,并且具有与C或C++接近的性能,因此,Rust拥有不断增长的用户群。

模拟器是体系结构研究和设计的重要工具。由于软件模拟器开发速度快、成本低、易于修改等特点,在处理器的设计验证和开发调优等方面都发挥了重要作用。现有的成熟模拟器有SimOs、QEMU等。QEMU是一套以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛,有高速度及跨平台的特性,能模拟至接近正常电脑的速度。此外,目前较新的异构系统模拟器框架以总线为核心,将各个运算单元和外围设备通过标准化的总线接口使得其和总线相连接,通过这种框架可以实现在忽略模块间结构差异的情况下完成异构系统模拟的搭建。

经分析,现有的成熟模拟器代码量庞大,结构复杂,不利于模拟器中模块的扩展。并且,目前还没有使用内存安全的语言实现的成熟模拟器,因此导致模拟器运行时可能出现因内存访问异常、内存溢出等问题带来的系统宕机和运行异常,而现有较小规模的模拟器缺少多核运行机制。

发明内容

本发明的目的是克服上述现有技术的缺陷,提供一种基于Rust的多核RISCV-CPU模拟器,是敏捷构建运行时内存安全的Riscv多核模拟器的新技术方案。

根据本发明的第一方面,提供一种基于Rust的多核RISCV模拟器,该模拟器包括Risc-V处理核心模块、总线模块、DRAM模块、CLINT模块、PLIC模块和UART模块,其中Risc-V处理核心模块设置为多个,并基于Risc-V开源指令集构造,用于实现取指令,译码和执行功能;DRAM模块用于模拟内存;PLIC模块用于模拟硬盘;UART模块用于模拟外部中断或本地中断;总线模块与用于控制Risc-V处理核心模块、总线模块、DRAM模块、CLINT模块,PLIC模块和UART模块之间的信息交互,以实现无冲突通信。

根据本发明的第二方面,提供一种基于Rust的多核RISCV模拟器的模拟方法。该方法包括:

参数解析器从命令行读取模拟器配置参数;

模拟器主函数模块根据参数解析器解析的配置参数生成硬件线程,在硬件线程上运行多个Risc-V处理核心模块,并管理所述Risc-V处理核心模块的启动和暂停;

主函数模块生成DRAM模块、CLINT模块,PLIC模块和UART模块的实例,并将可执行文件存入DRAM模块;

将Risc-V处理核心模块、DRAM模块、CLINT模块、PLIC模块和UART模块的实例的可变引用传入总线生成函数,以完成各模块和总线的连接;

Risc-V处理核心模块通过总线获取DRAM模块中保存的可执行文件,并运行指定程序。

根据本发明的第三方面,提供一种基于Rust的多核RISCV模拟器的生成方法。该方法包括以下步骤:

参数解析器从命令行读取模拟器配置参数,将命令行的输入解析为模拟器初始化所需的初始化参数并将其传入主函数模块;

主函数模块根据所述初始化参数和相应模块的数据结构,实例化DRAM模块、CLINT模块、PLIC模块和UART模块;

主函数模块声明用于容纳Risc-V处理核心模块的容器,该容器中的元素类型为Thread型变量,并根据用户在命令行中输入的CPU核心数目n,通过Rust的thread包建立同等数量的硬件线程,并将每个线程压入该容器内;

多个Risc-V处理器核心模块线程通过总线共享同一套DRAM模块、CLINT模块、PLIC模块和UART模块。

与现有技术相比,本发明的优点在于,所提供的基于Rust的安全多核RISCV-CPU处理器模拟器框架结构简单,利用Rust语言的线程机制和锁机制使得模拟器中处理器核心的数量易于修改并且可以并行运行。利用Rust语言,减少了模拟器和其他模块开发和运行时的内存安全问题,提高了模拟器的鲁棒性。利用本发明提供的模拟器可以很好地锻炼系统编程能力,并加深对体系结构有关知识的理解。

通过以下参照附图对本发明的示例性实施例的详细描述,本发明的其它特征及其优点将会变得清楚。

附图说明

被结合在说明书中并构成说明书的一部分的附图示出了本发明的实施例,并且连同其说明一起用于解释本发明的原理。

图1是根据本发明一个实施例的基于Rust的多核RISCV-CPU模拟器框架的示意图;

图2是根据本发明一个实施例的多核RISCV-CPU模拟器的生成流程示意图;

图3是根据本发明一个实施例的多核RISCV-CPU模拟器的运行流程示意图。

具体实施方式

现在将参照附图来详细描述本发明的各种示例性实施例。应注意到:除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对布置、数字表达式和数值不限制本发明的范围。

以下对至少一个示例性实施例的描述实际上仅仅是说明性的,决不作为对本发明及其应用或使用的任何限制。

对于相关领域普通技术人员已知的技术、方法和设备可能不作详细讨论,但在适当情况下,所述技术、方法和设备应当被视为说明书的一部分。

在这里示出和讨论的所有例子中,任何具体值应被解释为仅仅是示例性的,而不是作为限制。因此,示例性实施例的其它例子可以具有不同的值。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步讨论。

参见图1所述,所提供的基于Rust语言的多核RISCV-CPU模拟器(或称RISCV处理器的模拟器)包括Risc-V处理核心模块、总线模块、DRAM模块、CLINT模块、PLIC模块和UART模块。

处理器核心能够完成包括但不限于取指、译码和执行操作。本发明提供的模拟器实现RV32I的指令,其中利用RUST的锁机制实现原子指令,即当一个Risc-V处理核心模块读取一个字节时,其他Risc-V处理核心模块被设置为不能访问该字节的内存地址。此外,利用RUST的线程机制实现了使用多个硬件线程同时运行,以模拟多核的并行运行,其中每个硬件线程有自己的程序计数器,这些计数器存储下一条要执行指令的位置,从而提高了模拟器运行的速度。

具体地,仍结合图1所示,所提供的基于Rust的安全多核RISCV处理器的模拟器框架包含如下几个部分。

主函数模块,负责根据初始化参数实例化其它模块、产生一个或多个硬件线程运行Risc-V处理器核心、将可执行文件存入指定位置等。

Risc-V处理核心模块,标记为RISC-V 0~RISC-V n,这些核心模块基于Risc-V开源指令集构造,能够完成取指令,译码和执行功能。

总线模块(BUS),负责连接各个模块,并实现无冲突通信。

DRAM模块、CLINT模块,PLIC模块和UART模块和其他外设模块(标记为OTHER),分别实现对内存、硬盘、串口、外部中断和本地中断的模拟。

利用上述提供的多核RISCV-CPU模拟器,可实现敏捷模拟方法。结合图2所示,所提供的基于Rust语言的安全RISC-V多核处理器的敏捷模拟方法包括。

步骤S211,获取启动命令行。

例如,参数解析器从命令行读取模拟器配置参数。具体地,模拟器以命令行的方式启动,参数解析器从系统获取命令行的输入,将命令行的输入解析为模拟器初始化所需的初始化参数,其中包含待执行的bin文件的文件名、文件系统ramfs文件、CPU核心数和其它欲使用的模块名,并将其传入主函数模块。

在该步骤中,利用参数解析器,能够设定参数调整模拟器中RISC-V处理器核心数目等。

步骤S212,解析命令行参数。

模拟器主函数模块根据参数解析器解析的配置参数生成硬件线程,并在硬件线程上运行处理器核心,管理这些核心的启动和暂停。

具体地,模拟器的主函数模块根据所述初始化配置和模块的数据结构,实例化DRAM,VIRTIO,UART,PLIC和CLINT等模块,其中各模块分别实现对内存、硬盘、串口、外部中断和本地中断的模拟,同时主函数模块根据需求实例化其它需要的模块。实例化各模块时,例如使用Rust语言中的Arc型指针变量实例化,使得模拟器可以在设置为多核的情况下,多个Risc-V处理器核心模块可以无冲突地对其他模块进行访问。

在具体实现时,模拟器主函数模块声明一个用于容纳Risc-V处理器核心的容器,该容器中的元素类型为Thread型变量,根据用户在命令行中输入的CPU核心数目n,利用Rust的thread包建立同等数量的硬件线程,并将每个线程压入上述容器内,

步骤S213,获取处理器核心数和其他模块信息。

具体地,主函数模块生成DRAM模块、CLINT模块,PLIC模块和UART模块的实例,并将可执行文件存入DRAM模块。

优选地,所有Risc-V处理器核心线程通过总线共享同一套DRAM模块,VIRTIO模块,UART模块,PLIC模块和CLINT模块,这种方式,利用了总线并结合Rust锁机制实现无冲突通信。

步骤S214,实例化其他模块。

总线中设有模块接口,将上述Risc-V处理核心模块、DRAM模块、CLINT模块,PLIC模块和UART模块的实例的可变引用传入总线生成函数,以此完成模块和总线的连接。

Risc-V处理器核心模块通过总线获取DRAM模块中保存的代码并执行,运行指定程序。

步骤S215,创建硬件子线程运行处理器核心。

步骤S216,配置总线,连接模块。

图3是多核RISCV-CPU模拟器的运行流程,以模拟器运行bin格式的文件为例进行说明,包括以下步骤。

步骤S311,生成可执行文件和文件系统。

首先,使用Riscv交叉编译器将C语言程序编译为ELF格式的可执行文件,然后使用objcopy命令从可执行文件中提取出机器指令,保存为bin文件,并制作ramfs文件作为文件系统。

在该步骤中,使用命令行启动模拟器,通过上述多核RISCV模拟器的生成流程,产生用户所需的配置的模拟器。

步骤S312,模拟器将可执行文件存入DRAM中。

模拟器的主函数模块使用Rust的File包将所生成的bin文件读取到DRAM中,等待被Risc-V处理器核心模块执行。同样,使用Rust的File包将所述ramfs文件读取到Virtio中。

步骤S313,启动CPU子线程。

主函数模块创建多个CPU子线程,并启动运行。

步骤S314,CPU子线程对中断信号进行检查。

主函数模块所用线程在创建N个CPU子线程后会进入一个循环,在该循环内轮询检测是否有中断发生,如果有,则将线程容器内所有线程执行unpark方法,即恢复执行;如果没有,则该主线程会执行yield_now方法放弃自己的时间片。

步骤S315,CPU子线程执行指令。

CPU子线程根据需要执行指令。

在一个应用示例中,Risc-V处理器运行同一套代码cpu_run,该cpu_run代码主要完成3个功能,即取指、执行、检查中断,分别对应fetch、execute和check_pending_interrupt这3个函数。

其中fetch函数即以所在的Risc-V处理器核心中的pc变量为索引,通过总线模块从所述Dram中读取出对应的指令,传递给所述execute函数。

execute函数在接到待执行指令后根据指令内容完成根据RISC-V指令集所规定的指令格式完成译码,然后执行指令,其中原子指令的执行利用Rust的锁机制实现,即在执行指令前通过Rust语言中的Lock函数获得锁,在指令运行结束因生命周期结束自动释放。这种方式,能够防止在指令的执行过程中由于其他核心以不合法的顺序执行指令产生错误的运行结果,避免了多核运行时访问地址冲突。

综上所述,本发明提供的模拟器能够将多个模块连接到一个总线上。多个子模块使用Arc型指针变量实例化后和Bus上的接口连接,并通过Rust的锁机制访问避免数据冲突。在所提供的模拟方法中,主模块中引入thread库,在主函数线程中通过thread库中的spawn方法创建所需数量硬件线程,线程运行Risc-V处理器核心,并将可执行文件存入指定位置。此外,本发明提供的模拟器利用Rust语言强调安全,内存布局控制和并发的特性,减少了模拟器运行时因内存问题如内存泄露造成的错误。并且提供的模拟器结构简单,易于修改和扩展模块。经实验验证,该模拟器可以在配置为多核的情况下能够正常运行XV6等操作系统。

本发明可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。

计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。

这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。

用于执行本发明操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++、Python等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本发明的各个方面。

这里参照根据本发明实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。

这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。

也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。

附图中的流程图和框图显示了根据本发明的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。对于本领域技术人员来说公知的是,通过硬件方式实现、通过软件方式实现以及通过软件和硬件结合的方式实现都是等价的。

以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。本发明的范围由所附权利要求来限定。

11页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种32路RS485接口卡的实现系统

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!