`
prec
  • 浏览: 65391 次
  • 性别: Icon_minigender_1
  • 来自: 互联网
最近访客 更多访客>>
社区版块
存档分类
最新评论

[tamarin系列之4] 构建专用的avmshell

阅读更多

    前的三章已经为我们介绍了tamarin和开源的flex-sdk的一些基本操作,本章我们将要更加深入地了解avmshell和asc编译器。 1、深入tamarin项目

     到目前为止,我们仔细看看我们的tamarin-tracing的目录结构,可能我们从来都没深入了解也注意到他里面的文件:

 |-- build               //  make后的编译版本 

     |-- Makefile |

     |-- core |

     |-- extensions |

     |-- nanojit |

     |-- pcre |

     |-- platform |

     |-- shell            // 前三章,我们一直在这里用./avmshell和java -jar asc.jar进行示例

     |-- space

 

 |-- tamarin-tracing    // tamarin源码工程

     |-- axscript

     |-- build

     |-- configure

     |-- configure.py

     |-- core            // 核心文件夹

     |-- esc            // esc的编译器,相对于asc

     |-- extensions

     |-- localization

     |-- manifest.mk

     |-- nanojit

     |-- pcre

     |-- platform        // 平台文件夹,win的项目文件在这里可以找到

     |-- shell            // shell文件夹

     |-- space        // mmgc项目文件夹

     |-- test

     |-- utils            // 工具文件夹

     `-- zlib

 

   结构大体如上,其中   tamarin-tracing/core是程序的核心项目部分,主要构建builtin.abc部分,也有资料写作global.abc

   tamarin-tracing/shell是shell项目部分,主要构建shell.abc,也有资料写作toplevel.abc

     关于global.abc和toplevel.abc的构建请参考redtamarin项目(http://code.google.com/p/redtamarin/)

   这是另一个不同于官方的tamarin实现。

 

     2、定制我们自己的tamarin

 

     大家是不是有一些头晕,tamarin就tamarin吧,怎么还有个redtamerin? 这是另一套完全不同的项目吗?

     其实,关于tamarin项目的结果,只是最终生成了avmshell这个可以运行虚拟机的shell。而shell究竟内容如何,主要靠core和shell这两大块。

   而core是核心,里面基本是雷打不动的代码,比较偏重虚拟机内的方法,如AS3的内建方法,而shell则是偏重于本地代码的实现,即不同平台上的shell的实现,类似AIR。

    两部分合在一起,构成了tamarin的avmshell。

    那么,我们完全可以自己制作一个属于自己的shell,或自己的Integrated Runtime环境,就像之前说的Yahoo!Widgets。

    Goole Code上实现的叫redtamarin,我们大可以自己作一个bluetamarin。或者My Integrated Runtime 或叫 MIR,以区别AIR。这是完全可行的。

     redtamarin在global.as中选用了

include "core\/builtin.as"

 include "core\/Math.as"

 include "core\/ErrorConstants.as"

 include "core\/Error.as"

 include "core\/RegExp.as"

 include "core\/Date.as"

include "core\/XML.as"

 

 编译成global.abc来代替官方的 tamarin-tracing/core下的builtin_full.abc 在toplevel.as中,用 include "shell\\toplevel.as" include "shell\\Domain.as" include "shell\\StringBuilder.as" include "shell\\ByteArray.as" include "shell\\IntArray.as" include "shell\\UIntArray.as" include "shell\\DoubleArray.as" include "shell\\FloatArray.as" include "shell\\ShortArray.as" include "shell\\UShortArray.as" include "shell\\Dictionary.as" include "shell\\Endian.as" include "shell\\Java.as" //RedTamarin include "shell\\standard.Errors.as" include "shell\\standard.Operations.as" include "shell\\standard.as"

编译成toplevel.abc代替了官方 tamarin-tracing/shell下的shell_full.abc,如此而已。

 

 3、创建自己的build版本,定制avmshell 如果真要按照redtamarin这样定制下来,你会发现,需要编译的地方很多,出错的地方更多。可能大家会觉得没有足够的知识和耐心是不能作到的。

 

   实际上呢,redtamarin已经是个趋向与成品的东西了,就是说它中间经历过的编译过程和产生的文件,事实上都被删掉了,只留下了最终的结果,所以你按照redtamarin编译是没法成功的。

   其实我们没有必要从头来定制,core和shell的大部分代码我们都是很需要的,我们只需要在上面加上我们需要的就可以了,而tamarin-tracing也提供了编译和定制的工具。 我们看 tamarin-tracing/core下面有一个builtin.py,这个文件可以编译一些头文件和abc文件或声明内容。

 

 1)它调用了forth语言编译器fc(在 tamarin-tracing/utils下),生成fpu和soft fp部分,关于forth语言,这里就不再赘述。

 2)它使用asc.jar下的macromedia.asc.embedding.ScriptCompiler而不是macromedia.asc.embedding.Main(java -jar asc.jar默认的是执行Main)。

     这个ScriptCompiler既可以编译abc又可以生成cpp和h文件,从而在make时进一步编译生成avmshell。

 

     同理在tamarin-tracing/shell下也有shell.py,这个文件编译shell相关的abc和头文件或声明内容。 (注意,在运行这两个python脚本后生成的builtin_full.h和shell_full.h有BUG,稍后我们会详细说明这个问题)

 

    我们通过修改源文件,并使用builtin.py和shell.py来快速地进行cpp和h文件的生成,然后新建空文件夹configure,再通过make就可以构建我们自己的avmshell了。

 

 4、初步实践 首先,我们在build/shell的目录下(还是我们经常测试的那个目录)制作testShell.as:

 import avmplus.*;

 System.alert("test alert");

 

编译java-jar asc.jar testShell.as testShell.abc, 100 bytes written

 

运行./avmshell testShell.abc 结果输出

 

 TypeError: Error #1006: alert is not a function.

         at global$init() avmshell运行提示并没有定义这个alert方法。

 

 事实上,shell里也没有这个alert方法。我们可以定义一个。在tamarin-tracing/shell/shell.as中

 package avmplus {

         public class System         {

                 public native static function exit(status:int):void

                 public native static function getAvmplusVersion():String

                 public native static function debugger():void

                 public native static function isDebugger():Boolean

                 public native static function getTimer():uint

                 public native static function readLine():String

         // 加入这个方法

         public static function alert(text:String):void                 {

                         // 方法体,自己定义

                        write(text);  

         }

 

然后编译这个shell的头文件 tamarin-tracing/shell/shell.py

输出 Building Full AS3 shell: 80361 Files: 18 Time: 2614ms

 

 BEFORE 80361

 AFTER  46010

SAVED  34351 43%

 

Building Min AS3 shell: 6504 Files: 6 Time: 836ms

BEFORE 6504

 AFTER  3281

 SAVED  3223 50%

 

然后新建一个build2目录去configure & make,

 mkdir build2 cd build2 ../tamarin-tracing/configure --enable-shell --enable-debugger make 你会发现,编译错误,这是个BUG。

 

解决方法是,修改shell_full.h,把所有以AVMPLUS_NATIVE_METHOD_DECL(Atom开头的宏命令都替换成AVMPLUS_NATIVE_METHOD_DECL(BoxReturnType

 

 比如AVMPLUS_NATIVE_METHOD_DECL(Atom, avmplus_Domain_private__load)替换为AVMPLUS_NATIVE_METHOD_DECL(BoxReturnType, avmplus_Domain_private__load)

 

好了,再make,就可以编译了然后,我们就在build2/shell下,得到了一个新的avmshell 我们有两个不同avmshell了,两个不同的shell环境,想不想搞几个不同的avmshell发行版呢,或者自己作一个特色的AIR出来?

 

 这时候,我们可以针对两个build环境分别测试:在build/shell下用./avmshell  testShell.abc 结果输出 TypeError: Error #1006: alert is not a function.

         at global$init()

 

    在build2/shell下用./avmshell testShell.abc

 

 结果输出 test alert 有些环境下的tamarin-tracing可能输出不出来结果,不过没关系用

./avmshell -Dastrace 1 testShell.abc

 结果输出

 87 AVMINF: MTHD global$init ()

88 AVMINF: MTHD Object$$cinit ()

88 AVMINF: MTHD Class$$cinit ()

90 AVMINF: MTHD Function$$cinit ()

90 AVMINF: MTHD Object$/private::_hideproto ()

160 AVMINF: MTHD Object$/private::init ()

161 AVMINF: MTHD Object$/private::_hideproto ()

 161 AVMINF: MTHD private::MethodClosure$$cinit ()

 164 AVMINF: MTHD Namespace$$cinit ()

164 AVMINF: MTHD Object$/private::_hideproto ()

165 AVMINF: MTHD QName$$cinit ()

165 AVMINF: MTHD Object$/private::_hideproto ()

 166 AVMINF: MTHD Boolean$$cinit ()

166 AVMINF: MTHD Object$/private::_hideproto ()

171 AVMINF: MTHD Number$$cinit ()

181 AVMINF: MTHD Object$/private::_hideproto ()

 183 AVMINF: MTHD int$$cinit ()

184 AVMINF: MTHD Object$/private::_hideproto ()

186 AVMINF: MTHD uint$$cinit ()

 206 AVMINF: MTHD Object$/private::_hideproto ()

218 AVMINF: MTHD String$$cinit ()

219 AVMINF: MTHD Object$/private::_hideproto ()

 232 AVMINF: MTHD Array$$cinit ()

233 AVMINF: MTHD Object$/private::_hideproto ()

236 AVMINF: MTHD private::FieldName$$cinit ()

236 AVMINF: MTHD private::StackFrame$$cinit ()

237 AVMINF: MTHD private::ArraySort$$cinit ()

286 AVMINF: MTHD global$init ()

286 AVMINF: MTHD global$init ()

286 AVMINF: MTHD avmplus::Domain$$cinit ()

 286 AVMINF: MTHD global/private::getfiles ()

286 AVMINF: MTHD global$init ()

 287 AVMINF: MTHD avmplus::System$$cinit ()

 287 AVMINF: MTHD avmplus::System$/private::getArgv ()

287 AVMINF: MTHD avmplus::File$$cinit ()

 287 AVMINF: MTHD flash.system::Capabilities$$cinit ()

 287 AVMINF: MTHD Array/get length ()

287 AVMINF: MTHD Array/http://adobe.com/AS3/2006/builtin::shift ()

 287 AVMINF: MTHD Array$/private::_shift ()

287 AVMINF: MTHD Array/get length ()

287 AVMINF: MTHD Array/set length ()

287 AVMINF: MTHD Array/private::_set_length ()

287 AVMINF: MTHD Array/http://adobe.com/AS3/2006/builtin::push ()

287 AVMINF: MTHD Array$/private::_push ()

287 AVMINF: MTHD Array/get length ()

 287 AVMINF: MTHD Array/get length ()

287 AVMINF: MTHD Array/set length ()

287 AVMINF: MTHD Array/private::_set_length ()

288 AVMINF: MTHD Array/get length ()

288 AVMINF: MTHD Array/get length ()

288 AVMINF: MTHD Array/get length ()

288 AVMINF: MTHD avmplus::Domain/load ()

288 AVMINF: MTHD avmplus::Domain/private::_readAndLoad ()

288 AVMINF: MTHD global$init ()

288 AVMINF: MTHD flash.utils::ByteArray$$cinit ()

288 AVMINF: MTHD flash.utils::ByteArray$/readFile ()

 288 AVMINF: MTHD global/_checkNull ()

 288 AVMINF: MTHD flash.utils::ByteArray$iinit ()

288 AVMINF: MTHD Object$iinit ()

289 AVMINF: MTHD global$init ()
289 AVMINF: MTHD avmplus::System$/alert ()

289 AVMINF: MTHD avmplus::System$/write ()

289 AVMINF: MTHD global/_checkNull () testShell

289 AVMINF: MTHD Array/get length ()

 

看这一行289 AVMINF: MTHD avmplus::System$/alert (),说明alert已经执行,并调用了

 

289 AVMINF: MTHD avmplus::System$/write ()

 

好了,今天的内容到此结束。 今天主要稍微简单地深入了一下tamarin的各部分构成,以及如何定制自己的avmshell。 接下来,我们要深入了解native这个本地代码关键字以及如何让AVM2虚拟机来执行外部的本地代码。

分享到:
评论

相关推荐

    tamarin-prover入门级介绍

    Tamarin提供了两种证明构建方式: - **全自动模式**:使用启发式策略引导证明搜索,高效且无需人工干预。如果搜索成功,它会返回一个正确性证明(针对无限线程和新鲜值的情况)或反例(证明协议的不安全性)。 - *...

    PyPI 官网下载 | tamarin-utils-0.14.5.tar.gz

    在云原生环境中,Python库如`tamarin-utils`能够帮助开发者快速构建云服务。例如,它可能包含对Kubernetes(一个流行的容器编排系统)的接口,使得开发者可以轻松地管理和调度容器;或者它可能提供日志收集、监控、...

    网络安全协议形式化分析验证工具Tamarin的用户手册

    **网络安全协议形式化分析验证工具Tamarin用户手册** Tamarin是一款强大的形式化分析验证工具,专用于网络安全协议的分析和验证。它在符号模型中进行安全协议分析,可以帮助研究人员发现潜在的安全漏洞,如在TLS、...

    Python库 | tamarin-utils-0.15.4.tar.gz

    《Python库tamarin-utils-0.15.4:实用工具集详解》 在Python的广阔天地里,各种库犹如繁星点缀,为开发者提供了强大的功能支持。其中,`tamarin-utils`是一个实用的工具集合,它在版本0.15.4中为我们带来了诸多...

    tamarin-prover:Tamarin证明程序的主要源代码存储库,用于安全协议验证-Verification code source code

    Tamarin证明者资料库 本自述文件描述了Tamarin证明者用于安全协议验证的存储库的组织。 它的目标受众是Tamarin证明者的感兴趣的用户和将来的开发人员。 有关Tamarin证明器的安装和使用说明,请参见手册的第2章: : ...

    PyPI 官网下载 | tamarin-utils-0.15.1.tar.gz

    《PyPI上的tamarin-utils-0.15.1.tar.gz:Python库解析与应用》 在Python的世界里,PyPI(Python Package Index)是最重要的软件仓库,它为开发者提供了无数的工具和库,便于他们构建和分享自己的项目。本文将深入...

    PyPI 官网下载 | tamarin-utils-0.8.5.tar.gz

    `tamarin-utils`正是针对这样的需求而设计的,它提供了一系列与Zookeeper交互的Python接口,使得开发者可以更方便地在Python代码中使用Zookeeper的服务。这包括但不限于创建、删除、更新Zookeeper节点,以及监视节点...

    tamarin:小而简单的 Ruby Web 服务器

    它不是生产就绪的,它只是我学习如何构建自己的 Web 服务器的副项目。 为名利而生:P 安装 将此行添加到应用程序的 Gemfile 中: gem 'tamarin' 然后执行: $ bundle 或者自己安装: $ gem install tamarin ...

    基于Tamarin的5G AKA协议形式化分析及其改进方法_.pdf

    基于 Tamarin 的 5G AKA 协议形式化分析及其改进方法 本文主要介绍了基于 Tamarin 的 5G AKA 协议形式化分析及其改进方法。在 5G 移动通信网络中,3GPP 组织标准化了 5G AKA 协议,用以身份认证和密钥协商。文章...

    EMVerify:Tamarin模型和EMV分析

    EM验证 这是EMV标准的模型,是我们IEEE S&P 2021论文EMV标准:Break,Fix,Verify的补充材料。 有关这项工作的详细信息,请访问 。... :GNU脚本,用于生成目标模型并对其进行Tamarin分析。 *.oracle

    EMVerify-PAN-routing:Tamarin模型和EMV非接触式分析

    是GNU脚本,用于生成目标模型并对其进行Tamarin分析。 *.oracle是证明支持的*.oracle 。 包含自动生成的目标模型( .spthy )及其证明( .proof )。 以HTML格式显示分析结果。 包含有用的脚本: 是一个Python...

    thane:用于 MSOY 的 Tamarin VM 的修改版本

    Thane 是 Tamarin ( ) 的一个轻微修改版本,具有部分 Flash Player 兼容层,主要用 ActionScript 编写,并带有一点原生胶水。 引擎本身被修改为在 x86_64 架构下的 Unix 平台上运行。 现有的 Windows/64 支持已扩展...

    Tamarin HD Wallpapers Game Theme-crx插件

    包括Tamarin动作冒险视频游戏的高清图像 对于Banjo Kazooie Donkey Kong和Mario 64的粉丝! 包括动作冒险视频游戏Tamarin的高清图像。 对于Banjo Kazooie,Donkey Kong和Mario 64的粉丝! 我们始终会更新图像,因此...

    安全协议形式化分析

    2. **SSL/TLS协议**:这是Internet上最常用的安全协议之一,用于保护Web通信的安全。SSL/TLS协议位于应用层和传输层之间,主要由两部分组成: - 上层协议:包括TLS握手协议、TLS密码变化协议和TLS警告协议。 - ...

    monkey数据集(monkey.org)

    4. **数据分类**:"full"文件可能包含了大量不同类别的信息,我们需要依据特定的特征或属性将数据划分为不同的类别。这可能涉及创建新的分类变量或对现有变量进行编码。 5. **特征工程**:从原始数据中创建新的特征...

    as 殿堂之路

    为了进一步推动AS3的发展,Adobe采取了一系列开源措施,包括将AVM2虚拟机开源并捐赠给Mozilla的Tamarin项目。这一举措不仅增强了开发者对AS3的信心,也促进了AS3技术的广泛应用和发展。 #### 五、Adobe Integrated ...

    ActionScrip殿堂之路TXT版

    ### ActionScrip殿堂之路TXT版知识点概览 #### 一、ActionScript 3.0 (AS3.0)在RIA中的角色与重要性 **标题解析:** "ActionScrip殿堂之路TXT版" 表明这是一本关于ActionScript(AS)技术的书籍,而"AS3.0"则指出...

    Flash_ActionScript3殿堂之路.pdf

    - **Tamarin项目**:源码捐赠给Mozilla的Tamarin项目,这表明AS3正积极拥抱开源社区。 #### 4. Adobe AIR的意义 - **跨系统运行时**:2007年推出的Adobe AIR Beta版本,实现了RIA程序可以在多个操作系统上运行的...

Global site tag (gtag.js) - Google Analytics