在Linux系统上实现ARM64位浮点模拟器的方法技术方案

技术编号:38056959 阅读:19 留言:0更新日期:2023-06-30 11:22
本发明专利技术提出一种在Linux系统上实现ARM64位浮点模拟器的方法,其包括:在所述Linux系统上运行ARM64位指令;通过将指令分类器应用至所述ARM64位指令指出的机器代码中的第一特征代码,判断所述ARM64位指令是否为ARM64位浮点指令;以及因应于所述ARM64位指令是ARM64位浮点指令的事件,通过将所述指令分类器应用至所述ARM64位指令指出的所述机器代码中的第二特征代码,识别出所述ARM64位浮点指令为特定ARM64位浮点指令。ARM64位浮点指令。ARM64位浮点指令。

【技术实现步骤摘要】
在Linux系统上实现ARM64位浮点模拟器的方法


[0001]本专利技术是关于一种在Linux系统上实现ARM64位浮点模拟器的方法。

技术介绍

[0002]ARM(Advanced RISC Machine)架构广泛地应用于嵌入式系统。ARM针对浮点(floating point)运算的支持包括下列几种:
[0003]第一种支持是硬件实现的浮点协处理器(coprocessor)是由编译器将代码直接编译成浮点协处理器可识别的指令,在执行这种指令时,ARM核直接将它交给浮点协处理器去执行。浮点协处理器通常有一组额外寄存器来完成浮点参数传递及运算。新一代的ARM64是ARM架构的64位(64

bit)的扩展(extension),它为了支持浮点运算,添加了浮点协处理器,并定义了浮点指令集,但若缺乏实际的硬件,则指令会被拦截而改由浮点模拟器来执行。
[0004]第二种支持是软件实现的软浮点库。软浮点库支持是交叉工具链(cross toolchain)所提供的功能,而与Linux内核无关。当使用交叉工具链编译浮点操作时,编译器会以内联的软浮点库取代浮点操作,如此生成的机器代码(machine code)完全不含浮点指4EE4,却可正确地完成浮点操作。然而,公知的主流交叉工具链均未提供相应ARM64的软浮点库。
[0005]第三种支持是软件实现的浮点模拟器。在早期,ARM并没有协处理器,浮点运算是由软件通过CPU来模拟的,即浮点模拟器,其主要通过未定义指令处理器(undefined instruction handler)来实现。然而,它会造成极频繁的异常(exception),因而大幅增加中断延迟,降低系统实时性。此外,公知的Linux内核不支持ARM64位浮点模拟器。
[0006]目前,Linux只有ARM32位(32

bit)浮点模拟器,而没有ARM64位浮点模拟器。
[0007]一般而言,嵌入式系统都需要进行浮点运算,在公知的Linux内核不支持ARM64位浮点模拟器的情形下,ARM64位浮点协处理器的功能被裁剪,无法进行浮点运算操作,这时,只可将ARM64降级为ARM32来运用。因此,亟须提出一种在Linux系统上实现ARM64的浮点运算的方法,以解决上述问题。

技术实现思路

[0008]有鉴于此,本专利技术提出一种在Linux系统上实现ARM64位浮点模拟器的方法,其包括:在所述Linux系统上运行ARM64位指令;通过将指令分类器应用至所述ARM64位指令指出的机器代码中的第一特征代码,判断所述ARM64位指令是否为ARM64位浮点指令;以及因应于所述ARM64位指令是ARM64位浮点指令的事件,通过将所述指令分类器应用至所述ARM64位指令指出的所述机器代码中的第二特征代码,识别出所述ARM64位浮点指令为特定ARM64位浮点指令。
[0009]可选地,或较佳地,当所述ARM64位指令是所述ARM64位浮点指令时,陷入ARM64位异常,其中在所述陷入所述ARM64位异常时,保存所述ARM64位异常现场并且处理所述ARM64位浮点指令;而在所述处理所述ARM64位浮点指令完成后,退出所述ARM64位异常。
[0010]可选地,或较佳地,所述处理所述ARM64位浮点指令还包括:定义浮点寄存器及状态结构体,以保存所述处理所述ARM64位浮点指令的浮点运算过程中的一或多个数据。
[0011]可选地,或较佳地,所述指令分类器是配置成根据ARM64针对浮点类指令的编码规则来进行单层解析或逐层解析,以决定所述ARM64位浮点指令的类别及所述特定ARM64位浮点指令。
[0012]可选地,或较佳地,所述指令分类器是配置成将所述ARM64位浮点指令表示为二进制表示,共32位,自最高位至最低位依序定义为第31位至第0位。
[0013]可选地,或较佳地,所述指令分类器是配置成根据所述ARM64针对浮点类指令的编码规则,定义所述二进制表示的第31位为标签sf,第29位为标签S,第22至23位为标签type,第19至20位为标签rmode,第16至18位为标签opcode,而根据type、rmode或opcode之中的值来决定所述ARM64位浮点指令的所述类别。
[0014]可选地,或较佳地,将所述ARM64位浮点指令分类为转换类指令、比较类指令或运算类指令。
[0015]可选地,或较佳地,所述逐层解析包括在多次分类的其中一次分类中,将所述标签type作为所述第二特征代码,基于所述标签type进行分类而将所述ARM64位浮点指令分类为转换类指令、比较类指令或运算类指令。
[0016]可选地,或较佳地,所述处理所述ARM64位浮点指令还包括:按照所述指令分类器所决定的所述ARM64位浮点指令的类别及所述特定ARM64位浮点指令,分派相应的浮点库函数,来执行所述处理所述ARM64位浮点指令的浮点运算。
[0017]可选地,或较佳地,本专利技术的在Linux系统上实现ARM64位浮点模拟器的方法还包括在所述处理所述ARM64位浮点指令完成后,且在退出所述ARM64位异常前,判断所述下一个ARM64位指令是否为另一个ARM64位浮点指令;若判断所述下一个ARM64位指令仍然是另一个ARM64位浮点指令,则不退出所述ARM64位异常,并处理所述下一个ARM64位指令;若判断所述下一个ARM64位指令不是另一个ARM64位浮点指令,则退出所述ARM64位异常。
[0018]下文将配合图式并详细说明,使本专利技术的其他目的、优点及新颖特征更明显。
附图说明
[0019]图1显示本专利技术的一个实施例的在Linux系统上实现ARM64位浮点模拟器的方法的流程图。
[0020]图2A、图2B、图2C及图2D显示本专利技术的指令分类器执行逐层分类的具体例子。
[0021]图3显示本专利技术的另一个实施例的基于SEMI来优化针对ARM64的浮点模拟器的方法的流程图。
[0022]【附图标记说明】
[0023]SA1

运行代码的步骤;
[0024]SA2

陷入ARM64位异常的步骤;
[0025]SA3

处理ARM64位浮点指令的步骤;
[0026]SA31

执行指令分类器的步骤;
[0027]SA32

执行浮点库函数的步骤;
[0028]SA4

退出ARM64位异常的步骤;
[0029]TA1

判断是否为ARM64位浮点指令的步骤;
[0030]TB2

判断下一个指令是否仍然是ARM64位浮点指令的步骤;
[0031]SB1

运行代码的步骤;
[0032]SB2

陷入ARM64位异常的步骤;
[0033]SB3
本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种在Linux系统上实现ARM64位浮点模拟器的方法,其特征在于,包括:在所述Linux系统上运行ARM64位指令;通过将指令分类器应用至所述ARM64位指令指出的机器代码中的第一特征代码,判断所述ARM64位指令是否为ARM64位浮点指令;以及因应于所述ARM64位指令是ARM64位浮点指令的事件,通过将所述指令分类器应用至所述ARM64位指令指出的所述机器代码中的第二特征代码,识别出所述ARM64位浮点指令为特定ARM64位浮点指令。2.根据权利要求1所述的在Linux系统上实现ARM64位浮点模拟器的方法,其特征在于,当所述ARM64位指令是所述ARM64位浮点指令时,陷入ARM64位异常,其中在所述陷入所述ARM64位异常时,保存所述ARM64位异常现场并且处理所述ARM64位浮点指令;而在所述处理所述ARM64位浮点指令完成后,退出所述ARM64位异常。3.根据权利要求2所述的在Linux系统上实现ARM64位浮点模拟器的方法,其特征在于,所述处理所述ARM64位浮点指令还包括:定义浮点寄存器及状态结构体,以保存所述处理所述ARM64位浮点指令的浮点运算过程中的一或多个数据。4.根据权利要求1所述的在Linux系统上实现ARM64位浮点模拟器的方法,其特征在于,所述指令分类器是配置成根据ARM64针对浮点类指令的编码规则来进行单层解析或逐层解析,以决定所述ARM64位浮点指令的类别及所述特定ARM64位浮点指令。5.根据权利要求4所述的在Linux系统上实现ARM64位浮点模拟器的方法,其特征在于,所述指令分类器是配置成将所述ARM64位浮点指令表示为二进制表示,共32位,自最高位至最低位依序定义为第31位至第0位。6.根据权利要求5所述的在Linux系统上实现ARM64位浮点模拟器的...

【专利技术属性】
技术研发人员:颜飞杜鹏
申请(专利权)人:达发科技苏州有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1