`
LeslieWei
  • 浏览: 13622 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Erlang虚拟机源码阅读笔录(二)虚拟机的指令集

阅读更多

2. Erlang虚拟机的指令集

在具体分析erlang进程的调度和执行过程前,我们需要简单的了解下erlang虚拟机的指令集的几种形式。

2.1. Erlang程序的内存结构

    Erlang程序beam文件是需要虚拟机解释执行的字节码文件,因此Erlang的进程结构不同于普通的操作系统进程,Erlang的所有进程数据包括代码,堆栈结构都是存放在数据区里,Erlang进程并没有普通进程拥有的代码区。Erlang进程的stack结构包含了函数调用帧的临时变量和返回地址,heap包含了Erlang进程执行过程中创建的数据。Erlang进程的堆栈总是同时被分配的,并且始终是在同一块区域,并且栈顶和堆顶都朝对方相向增长,当栈顶和堆顶相遇了,就进行垃圾回收。堆的大小增长在一定范围内是按Fibonacci数列增长。

    每个Erlangcall frame在栈中都是以一个返回地址开始,后面紧跟是临时变量。每个Erlangterm用一个32位的unsigned word类型数据代表,每个term包含值和一个tagtag占用4位,并且存在最小有效位中,tag用来标识term的类型,tag的定义如图2.1.1




 
2.1.1

2.2. Erlang虚拟机的寄存器

The BEAM Virtual Machine uses the following registers:

    HTOP - top-of-heap pointer

    E - top-of-stack pointer

    CP - return-address pointer (where to go when a function is ready executed)

    I - next-instruction pointer

    x(N) - argument registers (to pass function parameters), x(N) are also used to hold temporal variables

    y(N) - local variables (y(N) are not real registers, they reside in a local frame and are accessed by integer offset from a top-of-stack pointer)

 fcalls - number of reductions done (to check for suspension while doing function call)

2.3. Erlang虚拟机的指令格式

   Erlang源程序文件在经过编译后生成对应的字节码文件,其格式为:




 
 

 

在这种格式中的opcode_value小于255的占用一个字节,大于255的将占用两个字节。

字节码语法图形式比较复杂,操作数按他们的类型大致可以分为以下几种:

8-bit long

  • magic number
  • function arity
  • type of arithmetic
  • type of operand
  • type of bif
  • sign of bignumber value

16-bit long

  • atom length
  • float length
  • code length
  • register number
  • frame size
  • heap requirement

24-bit long

  • relative address

32-bit long

  • integer value
  • code size
  • tuple arity
  • tuple index
  • string length
  • bignum arity
  • bignum value

除此之外,其它的操作数都是16位长。

然后字节码文件不能被直接执行,需要由erlang虚拟机解释执行。Erlang虚拟机加载字节码文件后会将字节码映射成虚拟机能识别的指令集,虚拟机指令集是使用C代码来定义的,称为threaded-code。其格式如下:




 
 

 

threaded-code的每一行都占用4个字节。threaded-code的定义在process_main()函数中。

Erlang虚拟机的指令集十分强大,除了普通的运算指令集还有丰富的Test InstructionsException Handling以及进程间消息通信的SendReceive原语。除此之外,Erlang虚拟机还提供了丰富的内建函数功能,内建函数主要是对那些访问频繁的函数进行优化处理。关于Erlang虚拟机指令集的详细说明,请参见这篇论文:The Erlang BEAM Virtual Machine Specification

  • 大小: 3.5 KB
  • 大小: 937 Bytes
  • 大小: 1 KB
分享到:
评论

相关推荐

    Erlang虚拟机内存管理

    Erlang核心开发者Lukas Larsson在2014年3月份Erlang Factory上的一个演讲详细介绍了Erlang内存体系的原理以及调优案例 根据siyao zheng博客上听写的资源进行的翻译,大致只翻译了80%但核心部分已经完整,希望对大家...

    hex, Erlang虚拟机的软件包管理器.zip

    hex, Erlang虚拟机的软件包管理器 十六进制 Hex是Erlang虚拟机的软件包管理器。这个项目目前提供了与混合。tcm 工具构建的任务。有关安装说明和其他文档,请参阅 hex.pm 。在本地安装十六进制以进行开发: mix ...

    erlang 程序设计 源码

    erlang 程序设计 源码 erlang 程序设计 源码 erlang 程序设计 源码erlang 程序设计 源码

    erlang 部分源码

    erlang 部分源码, 虽然不是很全,但是大部分都有。 erlang 部分源码

    英雄远征erlang源码

    英雄远征服务器端erlang源码,用mysql数据库

    基于Erlang VM的语言

    基于Erlang VM的语言基于Erlang基于Erlang VM的语言 VM的语言基于Erlang VM的语言

    erlang21.0源码

    erlang21.0源码。! erlang21.0源码。!erlang21.0源码。!erlang21.0源码。!

    Erlang编程指南

    Erlang是运行于虚拟机的解释性语言,但是现在也包含有乌普萨拉大学高性能Erlang计划(HiPE)开发的本地代码编译器,自R11B-4版本开始,Erlang也开始支持脚本式解释器。在编程范型上,Erlang属于多重范型编程语言,...

    erlang server源码

    erlang server源码 一个聊天室服务器源码

    英雄远征erlang服务器源码含数据库

    erlang具有良好的高并发性 支持热更新 本代码适合初学者更快的上手

    Erlang程序设计(第二版)及源码

    本书由Erlang之父Joe Armstrong编写,是毋庸置疑的经典著作。书中兼顾了顺序编程、并发编程和分布式编程,重点介绍如何编写并发和分布式的Erlang程序以及如何在多核CPU上自动加速程序,并深入地讨论了开发Erlang应用...

    远古封神Server(erlang源码)+文档+mongodb数据库

    远古封神Server(erlang源码)+文档+mongodb数据库 远古封神Server(erlang源码)+文档+mongodb数据库

    erlang 聊天室源码

    erlang 聊天室源代码,初学者项目,花了两周时间完成,其中设计参考的是著名聊天软件rabbitMQ 的部分模块

    erlang入门级练习:LeetCode OJ问题的部分erlang 源码

    我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...

    erlang源码包

    erlang源码安装包,此安装包是linux环境下的;erlang的版本是5.10.3

    erlang程序设计(第二版)随书源码

    erlang程序设计(第二版)随书源码,绝对完整,你值得拥有

    erlang聊天室源码

    附有需求文档,设计文档,以及一些说明文档,简单的聊天室功能,适合初学者阅读,是本人学习erlang过程中写的,参照了rabbitMQ的核心模块

    远古封神Server(erlang源码)

    远古封神Server(erlang源码)+文档+mongodb数据库

Global site tag (gtag.js) - Google Analytics