CN111767116B - 面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法 - Google Patents
面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法 Download PDFInfo
- Publication number
- CN111767116B CN111767116B CN202010495867.4A CN202010495867A CN111767116B CN 111767116 B CN111767116 B CN 111767116B CN 202010495867 A CN202010495867 A CN 202010495867A CN 111767116 B CN111767116 B CN 111767116B
- Authority
- CN
- China
- Prior art keywords
- file
- function
- module
- program
- virtual machine
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
-
- B—PERFORMING OPERATIONS; TRANSPORTING
- B25—HAND TOOLS; PORTABLE POWER-DRIVEN TOOLS; MANIPULATORS
- B25J—MANIPULATORS; CHAMBERS PROVIDED WITH MANIPULATION DEVICES
- B25J9/00—Programme-controlled manipulators
- B25J9/16—Programme controls
- B25J9/1656—Programme controls characterised by programming, planning systems for manipulators
- B25J9/1658—Programme controls characterised by programming, planning systems for manipulators characterised by programming language
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30145—Instruction analysis, e.g. decoding, instruction word fields
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Robotics (AREA)
- Mechanical Engineering (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供了一种面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法,所述虚拟机包括:代码载入模块,用于对经编译器编译产生的文本格式和二进制格式汇编文件进行加载,加载时基于预定的标识来识别所述汇编文件是文本格式还是二进制格式,并基于识别的结果调用相应的函数来对汇编文件进行加载;程序执行模块,用于运行代码载入模块输出的汇编程序转换结构体,为其创建上下文运行环境结构体并初始化所述结构体,加载动态扩展模块程序,运行初始化后的上下文运行环境结构体,基于虚拟机中预定的指令集解析执行字节码相应的指令。本发明的虚拟机支持对二进制文件的加载和运行,这增加了该虚拟机的支撑广度。
Description
技术领域
本发明涉及机械臂编程领域,更具体而言,本发明涉及一种面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法。
背景技术
机器人编程语言在整个机器人控制系统中占有十分重要的地位,它直接影响着工业机器人的基本作业和离线编程,从而影响到用户对机器人的使用效率。随着机器人技术的不断发展,机器人语言也不断地向前推进,其功能不断扩展,使用上也更加容易理解和上手。机器人编程系统作为机器人控制系统的一部分,国外一直处于垄断地位,国外厂商的控制系统及其控制终端一般只对自己品牌的机器人有一定的兼容性,其独有的设备配件和高昂的维修费用让国内相关产业耗费了大量的人力与财力。
虚拟机是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。由于虚拟机可以隔离底层硬件平台以及操作系统对上层应用的影响,因此非常有利于上层应用的开发。上层应用开发过程中无需关注底层平台的细节,只需要关注具体的业务逻辑。开发完成后,由虚拟机运行上层应用,负责将应用的代码转换为适用于底层平台执行的代码。虚拟机在机器人开发过程中至关重要,它为中间语言提供了一个可执行的虚拟机环境,确保中间语言可以在该环境下执行并且获得正确的运行结果。具体地,在许多场景中,上层应用由开发人员使用高级语言编写开发,之后通过编译器编译为字节码。字节码是一种可执行程序,由一系列操作码-数据对组成的二进制文件,是一种中间码。然后,虚拟机负责字节码文件的运行以及涉及的接口、业务流程的调用协调。但是现有的虚拟机除了支持中间语言之外,无法做到还支持多种类型的输入,如支持对二进制文件的直接输入和输出,这就限制了虚拟机的支撑广度。
如何实现虚拟机对二进制文件的执行,是一个亟待解决的问题。
发明内容
鉴于此,本发明设计了一种面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法,以消除或改善现有技术中存在的一个或更多个缺陷。
本发明公开了一种面向机械臂程序开发编程语言的虚拟机,该虚拟机包括:
代码载入模块,用于对经编译器编译产生汇编文件进行加载,所述汇编文件包括文本格式和二进制格式,所述代码载入模块对汇编文件进行加载时,基于预定的标识来识别所述汇编文件是文本格式还是二进制格式,并基于识别的结果调用相应的函数来对汇编文件进行加载;
代码载入模块对二进制格式的汇编文件的加载过程包括:读取所述二进制格式的汇编文件,将汇编文件中的程序代码和数据存放在预定的ELF格式文件相应的代码段和数据段中,对所述ELF格式文件进行逐行读取,将ELF格式文件中的数据保存在内存中,并将读取的ELF格式文件中的数据类型、变量和程序代码填充到第一结构体中相应的部分,并输出所述第一结构体;
程序执行模块,用于运行代码载入模块输出的第一结构体,其运行过程为:创建第二结构体并初始化所述第二结构体,加载动态扩展模块程序,运行初始化后的第二结构体,所述运行初始化后的第二结构体的过程包括:遍历保存在所述第二结构体中的代码程序块,从代码程序的入口函数进入调用程序,将代码压入堆栈形成代码帧,获取所述代码帧中的数据和字节码,基于虚拟机中预定的指令集解析执行字节码相应的指令;
所述第一结构体是代码载入模块预定的汇编程序转换的结构体;
所述第二结构体是程序执行模块预定的上下文运行环境结构体。
在一些实施例中,所述预定的标识是代码载入模块读取的汇编文件名字开头的魔术字。
在一些实施例中,所述代码载入模块还用于对动态扩展模块进行加载,加载的过程包括:
调用第一函数加载以规定方式命名的动态共享对象文件中的符号,并为加载的动态共享对象返回句柄;
调用第二函数对第一函数加载的动态共享对象文件中的符号和由第一函数返回的句柄进行操作,并返回所述符号对应的地址;
基于第二函数返回的地址获得动态共享对象文件中的扩展函数的函数名,将所述扩展函数加入到扩展函数表,输出第三结构体列表;
所述第一函数是用于加载动态共享对象文件中的符号,并为加载的对象返回句柄的函数;
所述第二函数是用于返回第一函数中符号对应地址的函数;
所述第三结构体是动态扩展模块接入结构体,用于存储动态扩展模块中的句柄信息和已注册的扩展函数。
在一些实施例中,所述动态共享对象文件中包含多个扩展函数,所述扩展函数是利用动态扩展模块的扩展接口并按照动态扩展模块规定的方式进行注册的外部函数,所述扩展函数是预先编译的。
在一些实施例中,所述程序执行模块还用于运行经代码载入模块加载的文本格式的汇编文件。
在一些实施例中,所述ELF格式文件中新增了多个数据段以存放二进制格式的汇编文件中的信息,所述多个数据段包括以下中的一个或多个:用于存放持久量的数据段、用于存放全局变量的数据段、用于存放局部变量的数据段、用于存放错误恢复信息的数据段、用于存放类型信息的数据段。
在一些实施例中,所述程序执行模块包括执行结构体和执行引擎;
所述执行结构体用于存储程序执行模块中的多种数据类型,所述执行结构体就是第二结构体;
所述执行引擎用于执行所述执行结构体中的存储的程序代码。
在一些实施例中,所述虚拟机还包括:
内嵌库模块,包括数据检索库、中断信号库和系统功能库;
程序调试模块,用于对程序执行模块中的程序代码进行调试,包括调试结构体和调试引擎。
在一些实施例中,所述数据检索库用于对程序代码中的数据变量进行检索、修改和设置;
所述中断信号库用于对错误信号进行捕获和处理;
所述系统功能库用于对变量类型进行判断,保存模块的状态,对可选参数进行判断。
本发明还公开了一种对汇编文件的运行方法,所述方法包括如下步骤:
读取二进制格式的汇编文件,将汇编文件中的程序代码和数据存放在预定的ELF格式文件相应的代码段和数据段中;
对所述ELF格式文件进行逐行读取,将ELF格式文件中的数据保存在内存中;
将读取的ELF格式文件中的数据类型、变量和程序代码填充到汇编程序转换结构体中相应的部分,并输出所述汇编程序转换结构体;
创建上下文运行环境结构体并初始化所述上下文运行环境结构体,加载动态扩展模块程序;
遍历保存在所述上下文运行环境结构体中的代码程序块,从代码程序的入口函数进入调用程序;
将代码压入到堆栈形成代码帧,获取所述代码帧中的数据和字节码,基于虚拟机中预定的指令集解析执行字节码相应的指令。
本发明实施例提供的面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法,除了支持中间语言之外,还支持对二进制文件的加载和运行,并确保多种情况下的运行结果一致无误,也增加了本发明的Tenon虚拟机的支撑广度。
本发明的附加优点、目的,以及特征将在下面的描述中将部分地加以阐述,且将对于本领域普通技术人员在研究下文后部分地变得明显,或者可以根据本发明的实践而获知。本发明的目的和其它优点可以通过在书面说明及其权利要求书以及附图中具体指出的结构实现到并获得。
本领域技术人员将会理解的是,能够用本发明实现的目的和优点不限于以上具体所述,并且根据以下详细说明将更清楚地理解本发明能够实现的上述和其他目的。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不构成对本发明的限定。在附图中:
图1为本发明中Tenon虚拟机的架构示意图。
图2为本发明一实施例中代码载入模块加载汇编文件的流程图。
图3为本发明一实施例中程序执行模块的结构示意图。
图4为本发明一实施例中程序执行模块执行汇编文件的流程图。
图5为本发明一实施例中程序执行模块中的中断处理的流程图。
图6为本发明一实施例中程序执行模块中的反馈机制的流程图。
图7为本发明一实施例中一种虚拟机对汇编文件的运行方法流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,下面结合实施方式和附图,对本发明做进一步详细说明。在此,本发明的示意性实施方式及其说明用于解释本发明,但并不作为对本发明的限定。
在此,还需要说明的是,为了避免因不必要的细节而模糊了本发明,在附图中仅仅示出了与根据本发明的方案密切相关的结构和/或处理步骤,而省略了与本发明关系不大的其他细节。
应该强调,术语“包括/包含”在本文使用时指特征、要素、步骤或组件的存在,但并不排除一个或更多个其它特征、要素、步骤或组件的存在或附加。
在此,还需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互结合。
本发明设计了一种面向机械臂程序开发编程语言的虚拟机,称为Tenon虚拟机(Tenon Virtual Machine,TVM)。TVM是Tenon机械臂语言编译系统中,具有执行能力的可执行程序,本发明对使用Tenon语言进行程序开发提供编译支撑,保证Tenon语言所开发的程序具备可移植性,其输入是Tenon汇编程序,一般无特定输出。本发明设计的虚拟机除了支持Tenon中间语言外,还支持对二进制文件的直接加载和运行,并确保了多种情况下的运行结果一致无误,这使得本发明的Tenon虚拟机具有其他虚拟机所不具备的支撑广度。
Tenon虚拟机,是面向Tenon中间语言所开发的虚拟机,可以执行Tenon中间语言所表示的程序。在整个Tenon体系中,为Tenon语言开发虚拟机,保证Tenon语言所开发的程序具备可移植性。图1为本发明中Tenon虚拟机的架构示意图。如图1所示,该虚拟机包括:
代码载入模块,用于对经编译器编译产生汇编文件进行加载,所述汇编文件包括文本格式和二进制格式,所述代码载入模块对汇编文件进行加载时,基于预定的标识来识别所述汇编文件是文本格式还是二进制格式,并基于识别的结果调用相应的函数来对汇编文件进行加载。
代码载入模块对二进制格式的汇编文件的加载过程包括:读取所述二进制格式的汇编文件,将汇编文件中的程序代码和数据存放在预定的ELF格式文件相应的代码段和数据段中,对所述ELF格式文件进行逐行读取,将ELF格式文件中的数据保存在内存中,并将读取的ELF格式文件中的数据类型、变量和程序代码填充到第一结构体中相应的部分,并输出所述第一结构体。所述第一结构体是代码载入模块预定的汇编程序转换的结构体。
源文件经过前端编译产生汇编文件,汇编文件的本质是虚拟机处理的字节码文件,也就是opcode,虚拟机对代码进行处理,映射到虚拟机栈中,由执行系统对代码进行取值处理执行。代码载入模块能对Tenon语言经编译器编译产生的以Tenon指令为主体的二进制格式的汇编文件进行加载,将二进制代码转换为本发明中预定的结构体。具体来说,首先,采用ELF文件为容器来存放Tenon语言的信息,读入二进制格式的汇编文件,将读取的Tenon语言的信息存放在ELF文件中的特定代码段和数据段中,并对所述ELF格式文件进行读取和解析。
本发明在ELF格式文件中新增了多个段(section),所述多个段包括以下中的一个或多个:.gdata数据段、.stack数据段、.pdata数据段、.erange数据段、.ttype数据段,所述.gdata数据段用来存放全局变量,所述.stack数据段用来存放局部变量,所述.pdata数据段用来存放持久量,所述.erange数据段用来存放错误恢复信息,所述.ttype数据段用来存放类型信息。当然,本发明并不限于此,也可根据具体情况增加相应的段来存放不同信息。
汇编文件中的程序代码和数据实际存放在ELF段中,本发明使用标准的段类型来标识一个段是(真段)否(伪段)包含实际内容,表1为本发明中ELF段的示例,如表1所示,PROGBITS意为包含实际内容,NOBITS表示该段不包含实际内容,Tenon系统是在运行时为所有的变量分配的存储空间,所以变量相关的段都为伪段。
表1本发明中ELF段的示例:
汇编文件中程序的组成单元和相关逻辑关系通过ELF符号体现,如表2所示为主要ELF符号表含义的示例:
表2主要ELF符号表含义的示例:
以上述表2所示的格式为依据,TVM实现对此格式文件的解析和输出。
完成将读取的Tenon语言的信息存放在ELF文件中的特定代码段和数据段中后,代码载入模块会对所述ELF格式文件进行读取和解析,对ELF文件解析过程为:
给定一个ELF格式输入文件:
1.读取所述文件的头部(ELF Header),根据偏移量从中获得ELF文件的段头部(Section Header)信息。
2.读取所述文件的字符串表(String Table),以获得存储变量名的字符串。
3.读取所述文件的符号表(Symbol Table),以获得目标文件所用到的所有符号。
4.根据偏移量从段头部信息中读取、解析代码段(Text Section)。
5.根据偏移量从段头部信息中依次读取、解析各种数据段,包括新增的扩展段(.gdata、.slack、.pdata、.erange、.ttype)。
6.进行重定位,更新跳转指令的目标地址。
将解析后的数据类型、变量和程序代码填充到所述代码载入模块预定的汇编程序转换结构体(Prog结构体)中,Prog结构体的结构如下代码所示:
表3为Prog结构体中的各个域及其含义的示例:
Prog域 | 含义 |
mods | Prog对应的程序代码模块 |
sstrtbl | 静态字符串表 |
vars | 变量范围池 |
types | 程序扩展类型 |
relocs | 程序重定位符号池 |
在载入汇编文件过程中,还会用到Module结构体和AsmCtx结构体,Module结构体是代码存储结构体,AsmCtx结构体为处理汇编源码的结构体。Module结构体的结构如下代码所示:
表4为Module结构体中的各个域及其含义的示例:
Module域 | 含义 |
name | 模块名 |
file | 源文件名 |
rewriter | 重写文件指针 |
funcs | 函数列表 |
entry_func | 入口函数 |
consts | 常量池 |
vars | 全局变量池 |
AsmCtx结构体的结构如下代码所示:
表5为AsmCtx结构体中的各个域及其含义的示例:
图2为本发明一实施例中码载入模块加载汇编文件的流程图,如图2所示,代码载入模块读取经编译器编译产生的汇编文件到缓冲区,完成一系列初始化操作,包括:初始化AsmCtx结构体代码部分,初始化指令或伪指令Hash表,之后初始化Prog结构体,初始化字符串表,初始化扩展类型,初始化全局值,最后扫描或搜索或处理汇编代码。
代码载入模块在加载二进制格式的汇编文件的过程中,涉及到的主要函数为as_file函数和prog_to_elf函数,as_file通过调用prog_to_elf实现读取二进制文件并进行解析。对as_file函数和prog_to_elf函数的说明如表6和表7所示。
表6为as_file函数的说明示例:
函数名称 | as_file |
函数说明 | 处理汇编/二进制文件 |
输入 | 文件名称 |
处理 | 读取文件内容进行相关解析 |
输出 | Prog结构体 |
返回值 | Int错误代码 |
as_file函数根据输入的汇编/二进制文件名称,读取文件内容并进行相关解析,输出Prog结构体。
表7为prog_to_elf函数的说明示例:
输入二进制文件名称,prog_to_elf函数根据ELF格式读取二进制文件并进行解析,输出Prog结构体。
调用prog_to_elf函数的代码示例如下所示:
从ELF文件载入接口:
static int prog_init(Prog*prog)
int prog_to_elf(Prog*prog,const char*name)
本发明中以ELF文件作为容器来存放从汇编文件中读取到的信息,利用ELF的不同段来存储Tenon程序的不同部分,同时利用符号表来呈现程序之间的逻辑关系,在通过对ELF文件进行解析,将解析后的数据类型、变量和程序代码填充到所述代码载入模块预定的汇编程序转换结构体中,从而实现代码载入模块对二进制格式的汇编文件的载入。二进制格式文件的存储加载速度较快,但其不具有可读性,在理解Tenon的二进制格式后,用户可以使用常见的ELF工具对程序(readelf,objdump等)进行概要查看亦或详细分析。
在一些实施例中,Tenon语言经编译器编译为以Tenon指令为主体的汇编文件后,除了以二进制格式进行存储,还可以文本格式进行存储,Tenon虚拟机的代码载入模块对二者都可以识别并加载。Tenon可以通过读取文件开头的魔术字(magicnumber)来识别是文本还是二进制,并基于识别的结果调用相应的函数完成对所述汇编文件的读取和解析。文本格式存储同其他常见的汇编格式并无太大区别,具有很强的自释性,但虚拟机需要进行文本分析,所以加载速度较慢。代码输出模块可以将文本形式的汇编代码转换成ELF格式的二进制文件,从而达到“加密”的目的。
代码载入模块读取汇编文件(文本格式)/二进制文件(ELF格式),将数据保存在内存中,再根据具体内容,进行逐行读取处理和转换,变为TVM虚拟机Insn数据,保存到Asm上下文中。代码载入模块输入项和输出项如表8和表9所示。
表8为代码载入模块输入项的说明示例:
表9为代码载入模块输出项的说明示例:
输出名称 | Tvm程序结构体 |
标识 | Prog |
数据类型 | 结构体 |
数据格式 | 结构体 |
数据值 | 汇编代码转换 |
输出方式 | 参数引用 |
代码载入模块中,通过调用as_mem2函数读取文本格式的汇编文件数据流,初始化相关结构体,逐行分析汇编文件内容,输出Prog结构体。对as_mem2函数的说明如表10所示。
表10为as_mem2函数的说明示例:
函数名称 | as_mem2 |
函数说明 | 处理汇编文件 |
输入 | 汇编文件数据流 |
处理 | 初始化相关结构体,逐行分析汇编文件内容 |
输出 | Prog结构体 |
返回值 | Int错误代码 |
调用as_mem2函数的代码示例如下所示:
从汇编文件载入接口:
int as_file(Prog*prog,char*file_name)
static int as_mem2(Prog*prog,char*mem,unsigned int len,char*file)
Tenon的运行时环境主要围绕Tenon指令集打造。Tenon语言经编译器编译为以Tenon指令为主体的汇编文件后,以文本或二进制格式进行存储。Tenon虚拟机对二者都可以识别并加载。
在一些实施例中,Tenon虚拟机的代码载入模块还可对动态扩展库模块进行加载。加载的过程包括:
调用第一函数加载以规定方式命名的动态共享对象文件中的符号,并为加载的动态共享对象返回句柄;
调用第二函数对第一函数加载的动态共享对象文件中的符号和由第一函数返回的句柄进行操作,并返回所述符号对应的地址;
基于第二函数返回的地址获得动态共享对象文件中的扩展函数的函数名,将所述扩展函数加入到扩展函数表,输出第三结构体列表;
所述第一函数是用于加载动态共享对象文件中的符号,并为加载的对象返回句柄的函数;
所述第二函数是用于返回第一函数中符号对应地址的函数;
所述第三结构体是动态扩展模块接入结构体,用于存储动态扩展模块中的句柄信息和已注册的扩展函数。
所述动态共享对象文件中包含多个扩展函数,所述扩展函数是利用动态扩展模块的扩展接口并按照动态扩展模块规定的方式进行注册的外部函数,所述扩展函数是预先编译的。
TVM支持动态加载扩展功能模块,按照TVM扩展接口的要求,在扩展模块中调用注册函数,编译成so文件后可以使用TVM–p指令动态加载此扩展模块。所述动态扩展库模块中的扩展函数是用其他语言编写的函数,扩展函数是预先编译的,加载时不发生编译,所述代码载入模块基于虚拟机的指令对动态扩展库模块进行加载。具体实现过程为:根据扩展模块定义要求,动态扩展模块接口中需要使用init_xxxx格式的函数进行扩展注册,其中,“xxxx”表示扩展模块的名称,如a.so模块,其init函数为init_a()。之后调用系统函数dlopen()函数和dlsym()函数进行操作。dlopen这个函数加载由以null结尾的字符串文件名命名的动态共享对象(共享库)文件,并为加载的对象返回不透明的“句柄”,dlsym()函数根据动态链接库操作句柄与符号,返回符号对应的地址。从而可以调用初始化函数进行注册,更新扩展函数表。
加载扩展功能模块时,涉及到的结构体是Cplugin结构体,Cplugin结构体是扩展模块接入结构体,用于存储扩展模块句柄和Init信息,Cplugin结构体的结构如下所示:
表11为Cplugin结构体中的各个域及其含义的示例:
CPlugin域 | 含义 |
handle | so打开指定的动态连接库文件返回的句柄 |
init | 动态链接库操作句柄(pHandle)与符号(symbol)对应的init函数地址 |
代码载入模块加载动态扩展模块时的输入项和输出项如表12和表13所示。
表12为输入项的说明示例:
输入名称 | So扩展文件 |
标识 | *.so |
数据类型 | 文件 |
数据格式 | ELF |
数据值 | 遵循TVM扩展规则的扩展so |
输入方式 | Tvm–p指定 |
输入数据来源 | 扩展接口编写后编译 |
表13为输出项的说明示例:
输出名称 | 扩展插件列表 |
标识 | plugin_list |
数据类型 | 结构体列表 |
数据格式 | 结构体列表 |
数据值 | 扩展模块的句柄和注册函数 |
输出方式 | 参数引用 |
动态模块载入常在cmd模式使用,使用流程如下:
a.定义扩展模块init函数如下代码所示:
b.使用命令编译动态模块so,如下代码所示:
gcc–fPIC-shard-o ironexample.soiron_example.c
c.载入so库,如下代码所示:
tvm–p ironexample.so test.asm
在代码载入模块,调用plugin_load函数来加载动态扩展模块,对plugin_load函数的说明如表14所示。
表14为plugin_load函数的说明示例:
函数名称 | plugin_load |
函数说明 | 加载动态扩展库模块 |
输入 | 动态扩展库so |
处理 | 调用dlopen和dlsym打开句柄和找到扩展函数中init注册函数 |
输出 | 动态扩展库列表plugin_list |
返回值 | 0成功<0失败 |
本发明实施例中虚拟机包括代码载入模块,代码载入模块用于加载经编译器编译产生的汇编文件(包括文本格式和二进制格式),其中,汇编代码主要以文本形式存储,二进制代码主要以ELF文件为容器。Tenon虚拟机对二者都可以识别并加载。代码输出模块可以将文本形式的汇编代码转换成ELF格式的二进制文件,从而达到“加密”的目的。另外,代码载入模块还能对动态扩展模块进行加载,通过调用系统函数来对共享库文件进行加载,从而调用初始化函数对扩展函数进行注册,并更新扩展函数表。
本发明实施例提供的虚拟机还包括:
程序执行模块,用于运行代码载入模块输出的第一结构体,其运行过程为:创建第二结构体并初始化所述第二结构体,加载动态扩展模块程序,运行初始化后的第二结构体,所述运行初始化后的第二结构体的过程包括:遍历保存在所述第二结构体中的代码程序块,从代码程序的入口函数进入调用程序,将代码压入堆栈形成代码帧,获取所述代码帧中的数据和字节码,基于虚拟机中预定的指令集解析执行字节码相应的指令。所述第二结构体是程序执行模块预定的上下文运行环境结构体。
图3为本发明一实施例中程序执行模块的结构示意图,如图3所示,程序执行模块包括运行上下文和运行引擎,程序执行模块读取代码载入模块载入的汇编文件,对文件中的代码和数据进行解析,为其创造程序运行的上下文环境,加载用户作业任务Prog,运行引擎进行取指和执行。具体来说,图4为本发明一实施例中程序执行模块执行汇编文件的流程图,如4所示,程序执行模块将保存在运行上下文中Prog结构体中的Module依次遍历,为其创建ExecCtx运行上下文环境未对其进行初始化,并加载动态扩展模块程序,运行ExecCtx结构体,从入口函数entry进入调用程序,push函数信息到堆栈,以形成Frame代码帧,Frame代码帧中包含各项运行信息和当前的函数,之后,获取Frame代码帧中的具体Insn,解析相应的opcode,基于TVM中预定的指令集解析执行字节码相应的指令。
程序执行主要依赖执行上下文结构体,上下文结构体内部记录了代码,堆栈,寄存器,中断错误管理等,ExecCtx运行上下文结构体如下所示:
/>
/>
表15为ExecCtx结构体中的各个域及其含义的示例:
exec_ctx域 | 含义 |
prog | Asm程序结构体 |
frames | 运行帧管理 |
stack | 栈空间256k |
heap | 堆空间256k |
regpool | 寄存器池 |
lvoffpool | 局部变量堆栈偏移池 |
argpool | 参数队列 |
retpool | 返回队列 |
irq_vec_tbl | 中断向量表 |
intern_err_handlers | 错误中断处理 |
extern_irq_handlers | 定义中断处理 |
exec_point | 内部异常处理设置 |
cfuncs | 扩展函数池 |
Mutex/cond | 执行引擎同步使用,用于多机同步 |
tvm_errno | 执行errno |
tpfd | 打印输出fd可以是本地也可以是远程socket |
logfd | 日志输出fd可以是本地也可以是远程socket |
而且,虚拟机中的其他模块可以使用Exec模块提供的接口,访问、获取和设置ExecCtx结构体中的数据。
程序执行模块还包括执行引擎,执行引擎负责执行ExecCtx结构体中存储的Prog代码,通过entry进入程序,逐步调用运行Prog程序。执行引擎的输入项如表16所示:
表16为执行引擎的输入项的说明示例:
输入名称 | 上下文运行环境 |
标识 | ExecCtx |
数据类型 | 结构体 |
数据格式 | 结构体 |
数据值 | 程序载入和扩展模块载入后的结构体数据 |
输入方式 | 传参数 |
输入数据来源 | 代码载入模块 |
执行引擎没有具体的数据输出,要根据具体的执行代码,进行相应的数据反馈。
在执行部分涉及到的关键函数包括:创建上下运行环境函数exec_create_ctx、注册加载的扩展插件函数exec_register_plugins和运行初始化后的上下文环境结构体函数exec_start,具体说明如表17、表18和表19所示。
表17为exec_create_ctx函数的说明示例:
函数名称 | exec_create_ctx |
函数说明 | 创建上下运行环境 |
输入 | Prog程序 |
处理 | 初始化上下运行环境,分配堆栈和寄存器空间 |
输出 | ExecCtx结构体 |
返回值 | 初始化后的上下文运行环境 |
表18为exec_register_plugins函数的说明示例:
表19为exec_start函数的说明示例:
函数名称 | exec_start |
函数说明 | 运行初始化后的上下文环境结构体 |
输入 | ExecCtx结构体 |
处理 | 获取entry函数,遍历prog程序,根据TVM指令集进行执行 |
输出 | 无 |
返回值 | 0成功 |
程序执行模块对经代码载入模块载入的汇编文件进行读取,对文件中的代码和数据进行解析,将其转化为虚拟机内部定义的存储结构体,基于预定的指令集依次读取和执行。
在一些实施例中,程序执行模块还可以对中断信号进行处理。程序在执行任务的过程中有可能触发中断,即内部中断,同时也有可能收到外部中断。虚拟机中通过connect来关联中断标识变量与其处理函数(trap函数)。当中断发生时,程序通过传递中断标识变量来通知运行时环境执行关联的中断处理函数。
中断的实现依赖Tenon系统的中断注册函数,如内部定义错误域和错误类型,目前Tenon系统内部定义了一系列的内部预定义中断种类和终端号,比如程序除零属于程序错误(编号为4)这个类别中的类型错误(编号为3)。如果系统运行时发生相关错误,并注册了中断号,则在Tenon中能找到相应的trap函数进行处理,实现错误中断机制。图5为本发明一实施例中程序执行模块中的中断处理的流程图,如图5所示,首先定义中断种类和终端号,通过connect来关联中断标识变量err_int和中断处理函数trap;然后调用中断注册函数,通过库函数IError来注册运行时系统,运行实体代码,触发trap函数,当程序收到除零错误中断时候举起err_int中断错误标识变量,执行标识变量关联的中断函数。
中断的使用步骤如下所示:
a.定义中断号变量;
b.连接中断处理函数;
c.注册中断处理号。
Tenon系统内部定义的错误域和错误类型如下所示:
错误域为:
错误类型:
错误域及错误类型的具体含义如表20所示:
表20为错误域和错误类型及其含义的示例:
ExecCtx运行上下文结构体中会记录中断相关的一系列函数、域及数据,其代码如下所示:
运行上下文中irq_vec_tbl用来记录中断向量,intern_err_handlers用来记录中断域和类型以及trap处理函数。intern_irqs为运行时发送错误记录,如果发生错误,则赋值SOFT_IRQ_INTERNAL_ERROR,并遍历intern_err_handlers获取相应trap函数,push堆栈中执行。
在处理中断时,涉及到的结构体是IrqHandler中断处理结构体,IrqHandler结构体如下所示:
表21为IrqHandler结构体中的各个域及其含义的示例:
IrqHandler域 | 含义 |
next | 指向下一个中断 |
domain | 中断域管理 |
type | 中断类型 |
trap | trap处理函数地址 |
在处理中断时,涉及到的主要函数是注册错误中断处理函数exec_register_intern_irq,此函数说明如表22所示:
表22为exec_register_intern_irq函数的说明示例:
函数名称 | exec_register_intern_irq |
函数说明 | 注册错误中断处理函数 |
输入 | int domain,int type,void*var, |
处理 | 将域、错误类型和中断号intnum关联到ExecCtx的错误中断列表 |
输出 | 无 |
返回值 | 0成功 |
此函数的输入为int domain,int type,void*var,然后基于输入将域、错误类型以及中断号intnum关联到ExecCtx的错误中断列表,无输出。
在一些实施例中,程序执行模块还可以对程序中的错误进行处理。错误处理是指在函数运行出错时执行的语句,它能够帮助程序从错误中恢复,从而保证任务顺利进行。错误处理以error开头,直至函数声明结束。我们可以为错误处理添加编号,并通过raise语句将错误提交到指定的错误处理处。错误处理与中断类似,也是系统运行时自发现,记录在上下文环境并上报抛出,ExecCtx运行上下文结构体中涉及错误处理部分的代码如下所示:
/>
当发生错误时,intern_irqs被设置为SOFT_IRQ_INTERNAL_ERROR,并将错误号记录在tvm_errno中,在执行下一条指令前,将检查相关错误。
错误处理不需要额外定义,直接使用error关键字即可实现,示例代码如下:
function safediv(num x,num y)
return x/y;
error
if ERRNO==ERR_DIVZERO then
return x;
end
end
在执行函数时,如果出现错误,系统会自动将ERRNO的值设为该错误对应的错误编号,并进入函数的错误处理部分。在这一函数中,如果错误类型是除数为零(ERRNO==ERR_DIVZERO),就会返回被除数的值
错误处理机理和中断类似,运行出错时会记录保存在上下文执行环境中,在错误检查时进行上报,与中断不同的是,错误有默认的error处理函数,在error处理函数中进行错误处理并不需要预先connect错误和处理函数。
在一些实施例中,程序执行模块还提供了反馈机制。在机械臂程序执行中,一部分函数或者指令是需要等待机械臂运动完成进行反馈,根据具体运动的不同,执行的机械臂函数或者指令又分为阻塞和非阻塞模式。反馈机制主要针对于封装函数,当执行封装函数代码时,获取运行上下文中的当前Frame,即可获取函数名,映射到具体指令,得到指令信息
反馈机制使用消息队列的方式。指令分为两大类,顺序指令和非顺序指令。图6为本发明一实施例中程序执行模块中的反馈机制的流程图,如图6所示,在Tenon语言层进行封装时,获取具体的指令信息,包括指令名、指令类别、指令源文件行号,基于获取的指令信息生成独立的指令id,将这些信息通过消息队列发给MP机理队列,并调用执行函数,指令id作为参数传入控制器,当控制器执行完成此id的指令后,控制器向MP消息队列发送此id,并将其从队列中移除,外部可以直接使用socket访问MP消息队列服务获取MP信息。
在一些实施例中,程序执行模块还提供了信号机制。信号机制是多模块运行过程中,一个模块向另一个模块进行信号通知的机制,其本质是一种外部中断。信号与中断类似,其也是记录在上下文环境中并上报抛出,ExecCtx运行上下文结构体中涉及信号机制部分的代码如下所示:
捕获信号时,intern_irqs被设置为SOFT_IRQ_EXTERNAL_IRQ,并将错误号记录在tvm_errno中,在执行下一条指令前,将检查相关错误。
Tenon的运行时环境提供signal和sigaction这两个库函数。Signal函数负责发起指定的中断号,并且在全系统广播。Sigaction函数则是潜在的中断接收任务用来注册中断处理函数。基于C语言标准库的信号通知机制,外部信号使用raise发出SIGUSR1,通知系统,被系统捕获后进行判断处理,并设置上下文运行环境。
第一个任务负责监视硬件的管脚电平信号,当信号变化时候则发送全局中断,我们同时假设电平信号变化的中断号为0。示例代码如下所示:
module sender
function void main()
var num sleep_sec=1;
waittime(sleep_sec);
!0=AIO_PIN_LEVEL_CHANGE
var num signum=0;
!Raise global interrupt
signal(signum);
end
end
第二个任务则等待系统电平信号改变,并在收到信息后打印信息。示例代码如下所示:
module receiver
var intnum irq_int;
function void main()
connect irq_int with ftrap;
!0=AIO_PIN_LEVEL_CHANGE
sigaction(0,irq_int);
var num sleep_sec=2;
waittime(sleep_sec);
end
trap ftrap
twrite("caught extern pin leval change!");
return;
end
end
signal和sigaction两个函数可以看作是对connect和其他中断库函数的简化,这两个函数提供了更加简单易用的中断通信接口。
信号机制部分的关键函数包括:tvm_sigaction函数和tvm_signal函数。tvm_sigaction函数是Sigaction函数的扩展实现函数,用于注册信号。此函数输入是事件号和中断号,内部把事件号和中断号注册到运行上下文中,无输出。tvm_signal函数是Signal函数的扩展实现函数,用于发出信号。此函数输入是事件号,调用raise发出用户信号,也没有输出。
在一些实施例中,程序执行模块还提供了多任务机制。Tenon运行时环境支持多任务并发运行,且会为每一个任务创建独立的运行时上下文。各任务拥有独立的代码和数据,在运行时互不干涉,并且每个任务也可以支持多文件。同时,Tenon为语言和运行时环境提供了必要的多任务通信机制,包括多任务共享变量、多任务中断通信等。由于每个程序或者模块都可以创建自己的运行时上下文环境,使用pthread_create为每个asm文件创建独立的解析运行任务,从而实现多线程的运行。多任务机制涉及到的关键函数为创建TVM子任务函数create_subtask,其函数说明如表23所示:
表23为create_subtask函数的说明示例:
函数名称 | create_subtask |
函数说明 | 创建TVM子任务 |
输入 | 线程任务id |
处理 | 使用pthread_create创建tvm运行完整子任务 |
输出 | int |
返回值 | 0成功<0失败 |
本发明实施例中的程序执行模块对经代码载入模块载入的汇编文件进行读取,对文件中的代码和数据进行解析,将其转化为虚拟机内部定义的存储结构体,基于预定的指令集依次读取和执行。另外,程序执行模块还支持对中断进行处理,对程序中的错误进行处理,为了保证任务的顺利运行,还提供了反馈机制、信号机制、多任务机制。程序执行模块保证了虚拟机的执行效率,也极大的扩展了虚拟机的支持深度和广度。
本发明实施例中的虚拟机还包括内嵌库模块。内嵌库模块利用Tenon系统的扩展机制,覆盖Tenon系统功能需求实现需要,结合系统数据结构,补充实现了数据检索、中断信号、模块同步等系统各项系统级别库,以支持Tenon系统各项功能机制,简化了开发人员的编程复杂性,也实现了在虚拟机层面通过扩展内嵌库来扩展支持的范围。
内嵌库包括数据检索库、中断信号库和系统功能库,各个库的具体功能如表24所示。
表24为内嵌库中各个库及其功能的说明示例:
库名称 | 功能类型 | 是否需要Tenon二次封装 |
数据检索 | 变量数据检索库支持 | 不需要 |
中断 | 面向中断,信号机制的库支持 | 不需要 |
系统功能 | 模块加载,同步等功能库支持 | 部分需要 |
数据检索库主要实现对程序中数据结点值进行搜索和设置,实现运行过程中的数据修改。数据检索库根据输入变量,获取此变量运行的上下文结构体,遍历此结构体中的数据变量进行检索、修改、设置等操作。数据检索库的主要API函数及其含义如表25所示。
表25为数据检索库中主要API函数的说明示例:
函数名称 | Tenon名称 | 含义 |
freedatasearch | freedatasearch | 释放某个数据索引 |
printdataval | printdataval | 打印数据值 |
setdatasearch | setdatasearch | 设置数据变量动态索引 |
setdataval | setdataval | 设置数据变量值 |
中断信号库用于对错误信号进行捕获和处理。中断信号库实现IError和信号注册,中断信号库是触发机制,是运行上下文中的内部信号中断和外部中断信号的应用。中断通过trap来声明一个trap函数,并以end结束声明。通过connect语句将trap函数与中断标识变量进行关联,且一个trap函数可以与多个中断标识变量进行关联。中断信号库的主要API函数及其含义如表26所示。
表26为中断信号库中主要API函数的说明示例:
函数名称 | Tenon名称 | 含义 |
IError | IError | 错误信号处理 |
tvm_sigaction | sigaction | 外部信号注册 |
tvm_signal | signal | 外部信号触发 |
系统功能库用于对变量类型进行判断,保存模块的状态,对可选参数进行判断等。系统功能是依托于扩展机制来实现Tenon需要使用的一些功能,包括模块状态保存、pers状态判断、信号互斥、可选参数判断等。变量类型判断根据具体变量结构体中相关信息进行判断,而信号互斥使用pthread_mutex_lock,pthread_cond_wait,pthread_mutex_unlock,pthread_mutex函数和运行上下文进行交互,从而实现其功能。系统功能库的主要API函数及其含义如表27所示。
表27为系统功能库中主要API函数的说明示例:
函数名称 | Tenon名称 | 含义 |
save_module | base_save | 模块保存 |
ispers | ispers | 是否为per变量 |
isvar | isvar | 是否为var变量 |
load_module | load | 模块载入 |
semdown | semdown | 申请信号 |
seminit | seminit | 信号初始化 |
semup | semup | 释放信号 |
modexist | modexist | 模块判断 |
present | present | 参数是否是可选 |
waitsynctask | waitsynctask | 任务等待 |
内嵌库模块是Tenon系统实现过程中,使用Tenon系统的扩展机制,调用相关POSIX标准库与系统内部关键数据和结构进行交互,以支撑Tenon系统基础功能的,不可移除的扩展库。
本发明实施例中的虚拟机还包括程序调试模块,用于对程序执行模块中的程序代码进行调试,程序调试模块包括调试结构体和调试引擎。
Tenon系统主要包括两大子系统:一个是编译系统,一个是虚拟机系统。编译系统用于将源码转换成可执行文件,虚拟机负责可执行文件的运行以及涉及的接口,业务流程的调用协调。与此相应的,Tenon系统中最重要的可扩展能力在实现上也分为两种层次,一个是源语言层次,一个是底层封装。Tenon系统在底层封装方面的扩展能力,体现在其通过内建库扩展其虚拟机支持广度。
本发明实施例还提供了一种虚拟机对汇编文件的运行方法,图7为本发明一实施例中虚拟机对汇编文件的运行方法流程图,如图7所示,所述方法包括如下步骤:
步骤S110:读取二进制格式的汇编文件,将汇编文件中的程序代码和数据存放在预定的ELF格式文件相应的代码段和数据段中;
步骤S120:对所述ELF格式文件进行逐行读取,将ELF格式文件中的数据保存在内存中;
步骤S130:将读取的ELF格式文件中的数据类型、变量和程序代码填充到汇编程序转换结构体中相应的部分,并输出所述汇编程序转换结构体;
步骤S140:创建上下文运行环境结构体并初始化所述上下文运行环境结构体,加载动态扩展模块程序;
步骤S150:遍历保存在所述上下文运行环境结构体中的代码程序块,从代码程序的入口函数进入调用程序;
步骤S160:将代码压入到堆栈形成代码帧,获取所述代码帧中的数据和字节码,基于虚拟机中预定的指令集解析执行字节码相应的指令。
本发明实施例提供的虚拟机对汇编文件的运行方法能够对二进制格式的汇编文件进行加载和执行,并确保可以支持多种情况下的运行结果一致无误。
本发明设计的Tenon虚拟机为Tenon的中间语言提供一个可执行的虚拟机环境,确保Tenon的中间语言可以在该环境下执行并且获得正确的运行结果。同时,该虚拟机的代码载入模块支持多种类型的输入,除了支持中间语言之外,还可以支持对二进制文件的直接输入和输出,并确保可以支持多种情况下的运行结果一致无误;该虚拟机的程序执行模块能对编译器产生的汇编文件(文本格式和二进制格式)进行执行;该虚拟机的程序调试模块能对程序执行模块的程序代码进行调试,使程序代码的执行安全可靠;该虚拟机的内嵌库模块使用Tenon系统的扩展机制,调用相关POSIX标准库与系统内部关键数据和结构进行交互,以支撑Tenon系统基础功能。以上这些特征提高了Tenon虚拟机的支撑广度。另外,Tenon虚拟机使用C语言开发,这使得虚拟机能够高效运行,而且其简洁的中间语言也提高了它的执行效率。
还需要说明的是,本发明中提及的示例性实施例,基于一系列的步骤或者装置描述一些方法或系统。但是,本发明不局限于上述步骤的顺序,也就是说,可以按照实施例中提及的顺序执行步骤,也可以不同于实施例中的顺序,或者若干步骤同时执行。
本发明中,针对一个实施方式描述和/或例示的特征,可以在一个或更多个其它实施方式中以相同方式或以类似方式使用,和/或与其他实施方式的特征相结合或代替其他实施方式的特征。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种面向机械臂程序开发编程语言的虚拟机,其特征在于,该虚拟机包括:
代码载入模块,用于对经编译器编译产生汇编文件进行加载,所述汇编文件包括文本格式和二进制格式,所述代码载入模块对汇编文件进行加载时,基于预定的标识来识别所述汇编文件是文本格式还是二进制格式,并基于识别的结果调用相应的函数来对汇编文件进行加载;
代码载入模块对二进制格式的汇编文件的加载过程包括:读取所述二进制格式的汇编文件,将汇编文件中的程序代码和数据存放在预定的ELF格式文件相应的代码段和数据段中,对所述ELF格式文件进行逐行读取,将ELF格式文件中的数据保存在内存中,并将读取的ELF格式文件中的数据类型、变量和程序代码填充到第一结构体中相应的部分,并输出所述第一结构体;
程序执行模块,用于运行代码载入模块输出的第一结构体,其运行过程为:创建第二结构体并初始化所述第二结构体,加载动态扩展模块程序,运行初始化后的第二结构体,所述运行初始化后的第二结构体的过程包括:遍历保存在所述第二结构体中的代码程序块,从代码程序的入口函数进入调用程序,将代码压入堆栈形成代码帧,获取所述代码帧中的数据和字节码,基于虚拟机中预定的指令集解析执行字节码相应的指令;
所述第一结构体是代码载入模块预定的汇编程序转换的结构体;
所述第二结构体是程序执行模块预定的上下文运行环境结构体;
所述汇编程序转换的结构体为Prog结构体;所述上下文运行环境结构体为ExecCtx结构体;
所述ELF格式文件中新增了多个数据段以存放二进制格式的汇编文件中的信息,所述多个数据段包括以下中的一个或多个:用于存放持久量的数据段、用于存放全局变量的数据段、用于存放局部变量的数据段、用于存放错误恢复信息的数据段、用于存放类型信息的数据段。
2.根据权利要求1所述的虚拟机,其特征在于,所述预定的标识是代码载入模块读取的汇编文件名字开头的魔术字。
3.根据权利要求1所述的虚拟机,其特征在于,所述代码载入模块还用于对动态扩展模块进行加载,加载的过程包括:
调用第一函数加载以规定方式命名的动态共享对象文件中的符号,并为加载的动态共享对象返回句柄;
调用第二函数对第一函数加载的动态共享对象文件中的符号和由第一函数返回的句柄进行操作,并返回所述符号对应的地址;
基于第二函数返回的地址获得动态共享对象文件中的扩展函数的函数名,将所述扩展函数加入到扩展函数表,输出第三结构体列表;
所述第一函数是用于加载动态共享对象文件中的符号,并为加载的对象返回句柄的函数;
所述第二函数是用于返回第一函数中符号对应地址的函数;
所述第三结构体是动态扩展模块接入结构体,用于存储动态扩展模块中的句柄信息和已注册的扩展函数。
4.根据权利要求3所述的虚拟机,其特征在于,所述动态共享对象文件中包含多个扩展函数,所述扩展函数是利用动态扩展模块的扩展接口并按照动态扩展模块规定的方式进行注册的外部函数,所述扩展函数是预先编译的。
5.根据权利要求1所述的虚拟机,其特征在于,所述程序执行模块还用于运行经代码载入模块加载的文本格式的汇编文件。
6.根据权利要求1所述的虚拟机,其特征在于,所述程序执行模块包括执行结构体和执行引擎;
所述执行结构体用于存储程序执行模块中的多种数据类型,所述执行结构体就是第二结构体;
所述执行引擎用于执行所述执行结构体中的存储的程序代码。
7.根据权利要求1所述的虚拟机,其特征在于,所述虚拟机还包括:
内嵌库模块,包括数据检索库、中断信号库和系统功能库;
程序调试模块,用于对程序执行模块中的程序代码进行调试,包括调试结构体和调试引擎。
8.根据权利要求7所述的虚拟机,其特征在于,
所述数据检索库用于对程序代码中的数据变量进行检索、修改和设置;
所述中断信号库用于对错误信号进行捕获和处理;
所述系统功能库用于对变量类型进行判断,保存模块的状态,对可选参数进行判断。
9.一种虚拟机对汇编文件的运行方法,其特征在于,所述方法包括如下步骤:
读取二进制格式的汇编文件,将汇编文件中的程序代码和数据存放在预定的ELF格式文件相应的代码段和数据段中;
对所述ELF格式文件进行逐行读取,将ELF格式文件中的数据保存在内存中;
将读取的ELF格式文件中的数据类型、变量和程序代码填充到汇编程序转换结构体中相应的部分,并输出所述汇编程序转换结构体;
创建上下文运行环境结构体并初始化所述上下文运行环境结构体,加载动态扩展模块程序;
遍历保存在所述上下文运行环境结构体中的代码程序块,从代码程序的入口函数进入调用程序;
将代码压入到堆栈形成代码帧,获取所述代码帧中的数据和字节码,基于虚拟机中预定的指令集解析执行字节码相应的指令;
所述汇编程序转换的结构体为Prog结构体;所述上下文运行环境结构体为ExecCtx结构体;
所述ELF格式文件中新增了多个数据段以存放二进制格式的汇编文件中的信息,所述多个数据段包括以下中的一个或多个:用于存放持久量的数据段、用于存放全局变量的数据段、用于存放局部变量的数据段、用于存放错误恢复信息的数据段、用于存放类型信息的数据段。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010495867.4A CN111767116B (zh) | 2020-06-03 | 2020-06-03 | 面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010495867.4A CN111767116B (zh) | 2020-06-03 | 2020-06-03 | 面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111767116A CN111767116A (zh) | 2020-10-13 |
CN111767116B true CN111767116B (zh) | 2023-09-05 |
Family
ID=72719908
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010495867.4A Active CN111767116B (zh) | 2020-06-03 | 2020-06-03 | 面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111767116B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113641389B (zh) * | 2021-08-31 | 2024-02-09 | 广东九联科技股份有限公司 | 基于OpenCPU的软件升级方法、装置及设备 |
CN113672238B (zh) * | 2021-09-07 | 2024-03-12 | 广东九联开鸿科技发展有限公司 | 基于实时操作系统模块化管理的运行方法、装置及设备 |
CN114161413B (zh) * | 2021-12-02 | 2024-01-23 | 上海神泰医疗科技有限公司 | 控制方法、开发方法、控制设备及机器人系统 |
CN114327479A (zh) * | 2021-12-27 | 2022-04-12 | 清华大学 | 用于大数据的数据处理方法和数据处理装置 |
CN114721893B (zh) * | 2022-06-09 | 2022-09-27 | 深圳精智达技术股份有限公司 | 一种全自动设备的数据处理方法及相关装置 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101000557A (zh) * | 2006-01-13 | 2007-07-18 | 北京金远见电脑技术有限公司 | 虚拟机 |
CN103514027A (zh) * | 2013-11-12 | 2014-01-15 | 北京深思数盾科技有限公司 | 一种增强软件保护易用性的方法 |
CN104503793A (zh) * | 2014-12-24 | 2015-04-08 | 风腾科技(北京)有限公司 | 代码练习软件中代码的运行和图形化的解析方法 |
CN105044653A (zh) * | 2015-06-30 | 2015-11-11 | 武汉大学 | 一种智能电表的软件一致性检测方法 |
CN105608346A (zh) * | 2015-12-25 | 2016-05-25 | 北京奇虎科技有限公司 | 基于arm指令虚拟化的elf文件保护方法及系统 |
CN106033370A (zh) * | 2015-03-16 | 2016-10-19 | 龙芯中科技术有限公司 | 64位Java虚拟机的实现方法及装置 |
CN109710384A (zh) * | 2018-12-29 | 2019-05-03 | 杭州趣链科技有限公司 | 一种安全的Java智能合约解释执行引擎及方法 |
CN110928840A (zh) * | 2019-11-22 | 2020-03-27 | 无锡市同翔科技有限公司 | 一种qnx6文件系统读取方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9529628B2 (en) * | 2014-03-21 | 2016-12-27 | Vmware, Inc. | Binary editing of applications executed by virtual machines |
US10929542B2 (en) * | 2018-09-17 | 2021-02-23 | Raytheon Company | Software policy engine in virtual environment |
-
2020
- 2020-06-03 CN CN202010495867.4A patent/CN111767116B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101000557A (zh) * | 2006-01-13 | 2007-07-18 | 北京金远见电脑技术有限公司 | 虚拟机 |
CN103514027A (zh) * | 2013-11-12 | 2014-01-15 | 北京深思数盾科技有限公司 | 一种增强软件保护易用性的方法 |
CN104503793A (zh) * | 2014-12-24 | 2015-04-08 | 风腾科技(北京)有限公司 | 代码练习软件中代码的运行和图形化的解析方法 |
CN106033370A (zh) * | 2015-03-16 | 2016-10-19 | 龙芯中科技术有限公司 | 64位Java虚拟机的实现方法及装置 |
CN105044653A (zh) * | 2015-06-30 | 2015-11-11 | 武汉大学 | 一种智能电表的软件一致性检测方法 |
CN105608346A (zh) * | 2015-12-25 | 2016-05-25 | 北京奇虎科技有限公司 | 基于arm指令虚拟化的elf文件保护方法及系统 |
CN109710384A (zh) * | 2018-12-29 | 2019-05-03 | 杭州趣链科技有限公司 | 一种安全的Java智能合约解释执行引擎及方法 |
CN110928840A (zh) * | 2019-11-22 | 2020-03-27 | 无锡市同翔科技有限公司 | 一种qnx6文件系统读取方法 |
Non-Patent Citations (1)
Title |
---|
"面向独立虚拟器件的简化虚拟化架构的研究";周乔;《中国硕士学位论文全文数据库信息科技辑》;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN111767116A (zh) | 2020-10-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111767116B (zh) | 面向机械臂程序开发编程语言的虚拟机及对汇编文件的运行方法 | |
US5787245A (en) | Portable debugging service utilizing a client debugger object and a server debugger object | |
US6158045A (en) | Portable debugging services utilizing a client debugger object and a server debugger object with flexible addressing support | |
US5815653A (en) | Debugging system with portable debug environment-independent client and non-portable platform-specific server | |
US8972950B2 (en) | Efficient automated translation of procedures in an constraint-based programming language implemented with notification and callback | |
US11249758B2 (en) | Conditional branch frame barrier | |
CN107704382B (zh) | 面向Python的函数调用路径生成方法和系统 | |
Andrews et al. | Zing: Exploiting program structure for model checking concurrent software | |
US20060212861A1 (en) | Typed intermediate representation for object-oriented languages | |
US20200143061A1 (en) | Method and apparatus for tracking location of input data that causes binary vulnerability | |
US11687388B2 (en) | Implementing optional specialization when executing code | |
CN112817597A (zh) | 运行在用户空间的基于ebpf的软件容器实现方法 | |
US11157249B1 (en) | Method and system for identifying and extracting independent services from a computer program | |
Horwat | Concurrent Smalltalk on the message-driven processor | |
CA2167306C (en) | Multiple entry point method dispatch | |
US10848410B2 (en) | Ranking service implementations for a service interface | |
Hanson | Event associations in SNOBOL4 for program debugging | |
Barnett et al. | Using abstract state machines at Microsoft: A case study | |
CN111767033B (zh) | 用于机械臂程序开发的编程系统及功能扩展方法 | |
CN113849397A (zh) | 执行引擎、虚拟机、相关装置和相关方法 | |
Fu | Design and implementation of an operating system in Standard ML | |
Hanson | Variable associations in SNOBOL4 | |
Vanegue et al. | Next generation debuggers for reverse engineering | |
US11106522B1 (en) | Process memory resurrection: running code in-process after death | |
CN117555811B (zh) | 基于静态符号执行的嵌入式软件分析方法、装置及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |