MENU

RISCV Mono JIT移植进度-1

October 2, 2022 • 未分类

RISCV Mono JIT 移植进度 - 1

Mono 简介

Mono 是一个由 Novell 公司主持的项目。该项目的目标是创建一系列符合 ECMA 标准(Ecma-334 和 Ecma-335)的.NET 工具,包括 C# 编译器和共通语言执行平台。与微软的.NET Framework 不同,Mono 项目不仅可以运行于 Windows 系统上,还可以运行于 Linux,FreeBSD,Unix,Mac OS X 和 Solaris。现在它已经被 dotnet 引入作为运行时的一部分。

JIT 是什么

JIT 编译器,英文写作 Just-In-Time Compiler,中文意思是即时编译器。它通常被作为虚拟机提高程序运行效率的方法。在程序的解释执行过程中。程序中的某段程序会被频繁地执行,同时我们也都知道,解释执行的效率是较低的,因此解释器就会将执行频率较高的代码编译成为本地的机器码直接运行,从而提高效率。

Mono JIT 的移植

Mono 通常按照函数为单位进行 JIT 编译,因此 JIT 编译的第一个阶段就是处理函数调用中返回值和参数。

  • mono_create_vars 方法中,Mono 对于参数做了一些 genetic 的处理,然后它会调用 mono_arch_create_vars 用于处理架构相关的参数的处理。(我目前的移植思路就是,首先 JIT 可以编译一个无参数无返回值的函数,因此这边没有做相关的处理和研究)
  • 接下来 Mono 会调用方法 mono_arch_emit_call,在这里按照 ABI 生成参数入栈代码的处理。对于 RISCV 架构来说,需要在这边进行参数寄存器(a0-a7)的分配,如果参数存在可变长参数或这参数过多,还需要将其分配到栈上。

Mono 的 LMF

无论是 JIT 运行还是解释运行,Mono 在执行的最后存在一个 LMF,其全称应该是 Last Manage Frame,其大概是被用来处理异常的抛出,以及资源的释放。