当前位置:首页 > 消费电子 > 消费电子
[导读]在嵌入式领域,如何降低系统与运行环境之间的相关性,在各种异构的嵌入式平台上快速构建系统一直是研究的重点。本文基于FORTH语言,通过对虚拟机工作原理的分析,以自主构建的JLP FORTH虚拟平台为例,描述了虚拟机的实现原理、指令定义、存储方法和核心算法,并且在存储上提出以分段的方式分离代码和数据,通过该方法构建的FORTH虚拟机具有了更高的系统安全性,并且调试方便、扩展性强,特别适合应用于嵌入式系统。

1.引言

虚拟机最初是美国计算机科学家波佩克(Popek)与戈德堡(Gerald)在虚拟化需求中给出了定义,专指有效的、孤立的真实计算机的副本,现在则指可像真实计算机一样运行程序的软件实现,包括跟任何真实计算机无关的虚拟机。根据运用和与机器的相关性可分为系统虚拟机和程序虚拟机,一个提供了完整的操作系统,另一个则以运行单个计算机程序为主。

嵌入式应用领域,嵌入式系统相关的CPU芯片和微计算机硬件系统种类繁多,并且不断推陈出新,甚至多核处理器已被普遍采用。但是在新平台上,难以针对每一种芯片或平台制定一种计算机语言来编程。解决的方法一是可采用公共计算机语言,用不同的编译器来生成机器码,但该方法需要具有该语言的编译器,在新平台上往往难以具备。另一种方法即建立一个虚拟机,然后用一个计算机语言,用一个解释器来解释执行。采用该方法,难点在于嵌入式虚拟机的构建,要能够适应多种环境、快速构建、可扩展。

FORTH是一种与众不同的计算机程序设计语言。它具有极强的扩展性,通过字的定义,可实现不断堆叠和扩展。同时,它又具有极好的交互性,指令可解释执行,这就为应用的调试带来了极大的便捷。本文基于FORTH语言,以自主构建的JLPFORTH虚拟平台为例,详细阐述FORTH虚拟机的实现原理和核心实现方法,模拟和实现了通用的交互式计算机结构,实现了真实计算机的典型工作流程[4],并且一改过去FORTH代码和数据混合存储的方式,在内存的存储上以分段的方式将内存分为CS、VS、DS、SS四个段,分别存储指令和数据,这样,就实现了系统指令和用户数据的分离,有效地提高了代码和系统的安全性,并且调试方便、扩展性强,尤其适合应用于对安全性、兼容性、移植性、扩展性、交互性要求高的嵌入式系统领域。

2.FORTH虚拟机实现原理

真实计算机的基本工作原理是存储和控制。计算机在控制器的指挥下,取出预先存储的指令序列(即程序)和数据,通过控制器译码,按指令的要求,取出数据完成运算,再把结果重新存储起来,如此循环,直至完成全部指令。对真实计算机来说,这个过程依托中央处理器CPU来实现,CPU包括运算器、控制器和寄存器。如果描述CPU核心工作过程,主要包括以下步骤:

(1)提取程序计数器值,该值指向的地址即指令地址;

(2)从该地址取出指令;

(3)程序计数器增加指令长度,即指向下一条指令地址;

(4)解码执行指令;

(5)返回结果。

由于FORTH虚拟机是工作在真实计算机上的,因此要实现FORTH虚拟机必须用对应关系依托真实计算机的代码来实现这个核心过程。

在FORTH虚拟机中,用核心算法--NEXT模拟了这个过程,将虚拟机指令和真实计算机指令实现对应,通过建立字典表,设置地址跳转,以串线码的方式将虚拟机命令字和直接机器指令实现对应,依托真实计算机指令完成了CPU的处理过程。如图1所示。

 

 

具体过程是:在FORTH定义字时创建链结构的字典表,在其中存储各个字的名称、长度、状态、指令码以及链接指针。例如定义FORTH字S:S DUP *;在字典表存放了各个FORTH高级字的名称和代码执行地址,其中也有S字的定义,在S字的代码场中存有S字的代码执行地址,该代码执行地址与code所描述的直接机器执行代码相对应,构成间接串线编码。当执行该指令时,首先查找字典表,找到S定义后,取出其WPF指令码中存放的地址,然后跳转到代码场该地址中,由于是FORTH高级字定义,所以首先执行“:”机器码将程序计数器所记录的下一条指令返回地址压入栈,然后跳转到参数场地址依序执行,直到最后的“;”返回指令执行后,再将原先存入栈的返回地址弹出,这样即完成一条指令的执行。其中,代码场和参数场分别存储指令和参数。以下以JLP FORTH虚拟机为例,详细描述其字典表、代码场、参数场的定义、虚拟机存储和指针的分配,以及核心算法。

3.指令的定义和存储

FORTH虚拟计算机采用该虚拟指令的存储地址来表示该指令,称为“地址码”.虚拟计算机的每个指令用名称(例如+、-、*)来表示,称为“字(Word)”.FORTH虚拟计算机的指令包括“复合字”和“基本字”.基本字也称为“低级字”,由真实计算机机器码和数据组成的,低级字组合可构成“复合字”,所以,“复合字”也称为“高级字”.

高级字和低级字都可通过定义扩展。扩展高级字用“:”冒号定义,通过高级字定义用已有的指令形成新的指令。格式如下:

:名字 … leave … ;其中执行leave指令可以跳出该FORTH字的执行,忽略掉其后的指令。扩展低级字则用机器码定义,格式如下:

CODE 名字 … … NEXT, END-CODE其中NEXT,指令可以让计算机执行下一条虚拟机指令。

对于真实计算机,用编译器生成的指令码序列中不需要保留指令名称。FORTH虚拟计算机不同,由于需要虚拟机执行和构造新的虚拟机指令,因此在虚拟计算机中要保留FORTH字的名称,用于存储FORTH字的存储空间就是“字典表”.在JLP FORTH虚拟平台中,字典表结构如表1,在图1中也有标注。

 

 

WPF里存储的指令码即FORTH字在存储空间的地址。由于允许FORTH字的名称长度不一样,因此采用链表结构可有效地存储它们,在LPF中即存放了下一个字的定义地址。

代码场和参数场用于共同存储FORTH字,如表2.

 

 

其中CFA存放实现虚拟机功能的CPU机器码开始地址。PFA依次存放组成它的虚拟机指令。对于基本字PFA的内容不一样。对于一个常数基本字,PFA就直接存放这个常数。对于一个变量基本字,PFA就存放数据段中这个变量的地址[6].

4.内存和指针分配

以往FORTH并未将代码和数据分开,在嵌入式应用中,往往指令和程序相对固定,而代码和数据混合致使调试不方便,同时在系统安全上也带来问题。在JLP FORTH虚拟机上,将内存分为代码段CS、代码空间VS、数据段DS、系统段SS四个部分。

(1)代码段CS:存放真实计算机的机器指令、内存分配信息以及与硬件有关的系统数据。

(2)“代码”空间VS:用来存放虚拟计算机的指令和字典。

(3)数据段DS:用来存放用户数据和虚拟机的堆栈等数据。

(4)系统段SS:用来存放系统堆栈和多任务系统数据表等,达到分离系统任务和用户,保证系统安全的目的。

采用这种存放方式,就可将CS和VS放在FLASH中,将DS和SS放在RAM,如此实现程序和数据的分离。这种新的虚拟机架构不仅可以适合嵌入式系统,也适合PC结构系统,而且更有利于内存保护的实现。

真实计算机主要依靠寄存器来实现加减乘除等运算。例如将AX和BX寄存器的内容相加结果放到AX中,因此寄存器的数量是衡量CPU运算能力的一个指标。FORTH虚拟计算机则采用直接面向运算过程的方法,采用堆栈的方式来实现简单的运算,例如取出堆栈顶上的两个数相加后,结果放回堆栈顶。对于复杂运算,直接用复合字或者机器码写出面向数据的算法,比如对矢量和矩阵的运算等。由于没有寄存器的概念,只有表示系统工作状态的各种系统变量以及实现系统运行的各种指针。为了提高虚拟计算机的执行效率,用间接寻址的CPU寄存器来实现。对应关系如下(注:箭头为在X86计算机中对应的寄存器)。

 

 

通过这些指针的定义,FORTH虚拟机可实现各种各样复杂的算法。[!--empirenews.page--]

5.NEXT核心算法与函数

FORTH虚拟机的核心算法--NEXT,它完成了指令的控制执行过程。如借用以上描述,用形式化的方法表示为:

由于FORTH虚拟机是工作在真实计算机上,因此要实现FORTH虚拟机必须用真实计算机的代码来实现这个核心过程,以X86汇编语言为例,其实现FORTH虚拟机核心过程的代码为(16位地址空间):

ES:BX,SI MOV

SI,#2 ADD

ES:[BX]JMP

从代码可以看出,它非常象一个子过程或函数的调用。在真实计算机中,函数是非常常用的一个功能,是若干指令的有序集合。

在FORTH虚拟计算机中高级字就可认为是“函数”.表3是真实计算机和FORTH虚拟计算机在函数调用中的执行过程对比。

 

 

6.实例

以下采用自下而上的编程方法,构造FORTH字P_DUMP用于查看内存基本信息,以此为例说明FORTH虚拟计算机相关程序的设计方法。参数有查看内存的段地址、偏移地址和区域长度。

 

 

 

 

 

 

7.结论

对于嵌入式应用来说,一个可扩展性好、可移植性好、可裁剪、实现快速,并且便于调试的嵌入式虚拟机,能给嵌入式应用的开发带来极大的方便。基于FORTH构筑的虚拟机,引入字典表完成指令和机器代码的对应,并用字定义来完成指令的扩展,使系统的结构具有了极大的灵活性和扩展性,仅仅通过对基本字的堆叠、组合就可完成高级字的层层定义,实现极其复杂的系统。在JLP FORTH中存储分段使得程序指令和数据能相对独立,有效地增强了系统的安全性。这些设计思路使得在其上构建的FORTH虚拟机具有了代码简单、调试方便、安全性高、扩展性强等特点,特别适合应用于嵌入式系统中。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭