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,其大概是被用来处理异常的抛出,以及资源的释放。