摘要:在嵌入式领域,如何降低系统与运行环境之间的相关性,在各种异构的嵌入式平台上快速构建系统一直是研究的重点。本文基于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虚拟机可实现各种各样复杂的算法。

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虚拟机具有了代码简单、调试方便、安全性高、扩展性强等特点,特别适合应用于嵌入式系统中。(作者:王丽清,杨为民,代红兵,周永录)

计算机实现两个数相加的过程,嵌入式FORTH虚拟计算机的实现相关推荐

  1. 数组两个整数相加 c语言,作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)...

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  2. 求数组最大数,该数为数组中某两个数相加

    题目: 百度笔试:在一个正整数集合S中,找出一个最大数C,使得C=A+B,其中A和B也是S种的元素. 思想: 首先,我们将数组从小到大进行快速排序.其次: 1.将最后一个数设为最大数设定为S: 2.用 ...

  3. 在O(N)时间内求解 正数数组中 两个数相加的 最大值

    一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相加的最大值,其中被加数的下标大于加数的下标.由加法运算的可逆性,j >i 这个条件可以去掉. 即求出: max ...

  4. 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】...

    [002-Add Two Numbers (单链表表示的两个数相加)] 原题 You are given two linked lists representing two non-negative ...

  5. mysql 两个数相加_LeetCode 01两数之和02两数相加

    LeetCode01两数之和 题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  6. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值输入 [1,3,5,7,9,11] 10输出 1,9 3,7 代码: import java.util.HashMap; import java ...

  7. CUDA学习(三)之使用GPU进行两个数相加

    在CPU上定义两个数并赋值,然后使用GPU核函数将两个数相加并返回到CPU,在CPU上显示 #include "cuda_runtime.h" #include "dev ...

  8. python每个数都可由集合中的某两个数相加而得

    python每个数都可由集合中的某两个数相加而得(这两个数可以相同) 问题表述 思路 代码 运行结果 问题表述 有一个自然数集合,其中最小的数是1,最大的数是100.这个集合中的数除了1之外,每个数都 ...

  9. Java 两个数相加的测试_Java 两个数字相加

    1.两个数字相加 Java中将两个数字相加: 例如:int x = 5; int y = 6; int sum = x + y; System.out.println(sum); // 打印输出 x ...

  10. python怎么设编程两个数相加时_黄哥Python, LeetCode 第二题两数相加代码

    来源力扣​leetcode-cn.com 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相 ...

最新文章

  1. 手摸手产品研究院 | 玲珑沙龙-一个可以“撕逼”的女性文化社区
  2. 与用户登录shell相关的文件/etc/profile,~/bashrc等浅析
  3. 近期几个ASP.NET开发经验(二)
  4. 服务器是什么系统_服务器自愈路由系统、单线以及BGP多线的区别是什么?
  5. 初中数学分几个模块_北京版初中数学:8大模块,59个必考易错知识点大集合,一定要注意!...
  6. C++——面向对象设计原则
  7. 【作者面对面问答】包邮送《Redis 5设计与源码分析》5本
  8. 怎么在百度里通过关键词搜索到自己的网站
  9. 关于微信wx.getUserInfo使用不了的问题
  10. 浙江工业大学校赛 XiaoWei的战斗力
  11. 从零开始学Symbian (基于carbid.c++、S60第三版)
  12. python壁纸数据抓取_Python《wallhaven壁纸爬取》
  13. 使电动机反转的matlab仿真图,基于simulink的Matlab仿真作业(电气工程专业)2
  14. 作为一个iOS攻城狮不得不了解的网络知识
  15. 搞懂WebRtc,语音社交源码的开发就入门了!
  16. 8个免费、可商用的视频素材网站,一定要收藏
  17. Android中Gson使用,flutter调用原生sdk
  18. [02]时区时间获取
  19. CentOS下安装cups实现局域网共享HP1020打印机
  20. 有趣的概率:三门问题

热门文章

  1. 樊登读书赋能读后感_樊登读书会读后感01012019
  2. 用Windows Media Service打造的流媒体直播系统
  3. Flickr网站体系结构分析
  4. 制作一份简单的网络地图(世博地图的配准和切割)
  5. 2017-2018-2 20179306 《网络攻防技术》第八周作业
  6. winhex万能恢复磁盘数据
  7. iOS -显示隐藏文件
  8. 5G NR SSB概述
  9. Javaer换坑指南之Linux
  10. word打开文档很久很慢_word文档 excel文档打开速度比较慢怎么办