APP下载

PKS 体系运行SilverLight 插件的研究与实现

2023-11-10徐志亮郭真铃李博袁泉谢小龙

电子技术应用 2023年10期
关键词:插件调用字节

徐志亮,郭真铃,李博,袁泉,谢小龙

(1.中电(海南)联合创新研究院,海南 澄迈 571924;2.中软信息系统工程有限公司,北京 102209)

0 引言

为了在信息技术产业链各个环节拥有自主知识产权,我国已将信创工程纳入国家发展战略,在政策和市场的逐步引导下,基础软硬件、应用软件、信息安全等领域国产化发展如火如荼。在这过程中,面临着大量现有应用软件与信创计算体系无法兼容的问题。各行业应用便开始了与信创相关计算体系的适配与迁移工作。

但是在实践的过程中往往会面临诸多问题,例如自研应用软件依赖一些第三方的闭源组件或信息系统是由第三方提供,使用单位不具备迁移适配的条件等,如何运行不做任何修改的Window 软件,为当前不具备迁移条件的Window 软件在信创相关计算体系上运行提供临时解决方案。

本文将基于PKS 体系以SilverLight 插件为例进行研究,该插件是基于x86 处理器和Windows 操作系统进行开发的,过去广泛应用于Web 网页程序中。在指令集和操作系统存在差异的情况下,SilverLight 插件在PKS 体系上无法运行。

目前,存在以下两种解决方案:一是在宿主机中安装Qemu 环境并创建Windows 虚拟机,在虚拟机中访问插件页面;二是在Wine 中运行浏览器并访问插件页面。

当前这两种解决方案均需耗费一定的硬件资源,且运行过程中存在高延迟的情况,未能有效解决Silver-Light 在PKS 体系上无法运行的问题。因此,本文提出一套解决方案,该方案将SilverLight 运行在由二进制翻译工具和Wine 构成的系统环境兼容层中,以Pipelight 作为通信机制,将系统环境兼容层与Pipelight 相结合,实现SilverLight 在PKS 体系上的顺利运行。

1 相关技术

1.1 NPAPI

网景插件应用程序编程接口(Netscape Plugin Application Programming Interface,NPAPI)是 由Mozilla推出的一种浏览器插件的接口标准。NPAPI 的接口分为两类,一是以“NP”“NPP”开头,该类接口由插件实现,主要用于创建并初始化插件实例、销毁插件实例等;二是以“NPN”开头,该类接口由浏览器实现,主要用于创建数据流、查询浏览器相关信息等。通常使用<object>标签或<embed>标签在网页中嵌入一个插件,标签中的type 属性是多用途互联网邮件扩展类型(Multipurpose Internet Mail Extensions,MIME),浏览器通过该属性确定嵌入的插件。

当访问一个嵌有插件的页面时,浏览器通过MIME查找并加载相应插件。若该插件是首次加载,则浏览器调用插件的NP_GetEntryPoints 函数和NP_Initialize 函数进行插件初始化,其中NP_GetEntryPoints 函数负责提供插件的函数表,NP_Initialize 函数负责记录浏览器提供的函数表。首次加载完成后,浏览器会根据页面内容创建一个或多个插件实例,即调用插件的NPP_New 函数。当关闭页面时,浏览器会调用插件的NPP_Destory 函数销毁该页面中的插件实例。当浏览器关闭时,浏览器调用插件的NPP_Shutdown 函数卸载插件[1]。浏览器调用插件函数的顺序如图1 所示。

图1 浏览器调用插件函数的顺序

1.2 Pipelight

Pipelight 是为解决在Linux 浏览器中无法运行SilverLight 的问题而设计的NPAPI 浏览器插件[2]。Pipelight 不仅针对SilverLight 作了适配,还适配了Flash、ActiveX 等Windows插件。Pipelight 分为两部 分:pluginloader.exe 和libpipelight.so。libpipelight.so作为NPAPI浏览器插件,由浏览器调用;pluginloader.exe 负责调用SilverLight,获取相应的数据。但Pipelight 是基于x86-Linux 开发的,因此无法直接运行在PKS 体系中,还需根据PKS 体系做相应的修改和适配。

1.3 SilverLight

SilverLight 是微软于2007 年针对Web 应用程序中多媒体服务需求大和网页交互性差的问题提出的解决方案[3]。在传统的B/S 技术中,客户端只是呈现静态页面和结果,而SilverLight 能让用户体验丰富的图形界面和流畅的交互效果。用户在使用浏览器访问嵌有SilverLight 插件的页面之前,需在系统中部署SilverLight。网页开发者需使用<object>标签将SilverLight 插件嵌入到页面中,标签中的type 属性常为application/xsilverlight 和application/x-silverlight-2[4]。

2 框架设计与实现

2.1 整体设计

为实现SilverLight 在PKS 体系中运行,需要解决以下三个方面的问题:

(1)如何在ARM 处理器上运行x86 程序:飞腾处理器属于ARM 处理器的一种,而SilverLight 是在x86 处理器上开发和运行的程序,无法直接在ARM 处理器上运行。这本质上是指令集不同的问题。

(2)如何在Linux 操作系统上运行Windows 程序:麒麟操作系统是基于Linux 内核开发的,属于Linux 操作系统,而SilverLight 是基于Windows 操作系统开发的程序,无法直接在Linux 操作系统上运行。

(3)浏览器如何调用SilverLight:在PKS 体系下浏览器插件以NPAPI 插件为主,而且浏览器无法直接调用SilverLight 这类Windows 专用插件,因此这两者之间需要建立一个通信机制,该机制不仅能作为NPAPI 插件供浏览器调用,同时能根据浏览器请求信息调用Silver-Light 插件并返回相应数据。

根据上述问题设计了一套解决方案,如图2 所示。该方案中用二进制翻译工具解决指令集不同的问题;用Wine 解决操作系统不同的问题;用Pipelight 解决浏览器调用SilverLight 的问题。

图2 方案整体设计

基于上述方案,当用户访问嵌有插件的页面时,调用步骤如下:

(1)浏览器根据MIME 在插件默认路径下查找并加载相应的插件程序,即libpipelight.so。在Linux 系统中,浏览器插件默认存放路径是/usr/lib/mozilla/plugins。

(2)libpipelight.so 启动系统环境兼容层、创建子进程并调用pluginloader.exe,将浏览器的函数调用通过管道传输给pluginloader.exe。

(3)pluginloader.exe 根据接收信息调用插件相应的NPAPI。

2.2 系统环境兼容层

系统环境兼容层主要分为两部分:二进制翻译工具和Wine。

二进制翻译技术分为静态翻译和动态翻译。静态翻译是指先进行翻译工作,再运行翻译后的程序。动态二进制翻译技术是指在程序运行时动态将原指令翻译成目标指令的技术。本文使用的二进制翻译工具属于动态二进制翻译工具,实现从x86 指令翻译成ARM 指令的功能,即在二进制翻译工具所设的环境内,系统是x86-Linux 环境。要想进一步将x86-Linux 环境更换成x86-Windows,则需要另一个操作系统模拟工具——Wine。

Wine 是一个将Windows API 调用翻译成动态的POSIX 调用的兼容层。与虚拟机完全模拟Windows 内部逻辑的原理不同,这是一种库级虚拟化工具。比起笨重的虚拟机,Wine 的运行效率更高、系统资源占用更少、对计算机的性能要求更低。通过Wine,可以实现从Linux 操作系统到Windows 操作系统的转换。

由二进制翻译工具和Wine 构成的系统环境兼容层,实现了从ARM64-Linux 到x86-Windows 的双重翻译,给在PKS 体系上运行SilverLight 提供了可能。

2.3 通信机制

为解决浏览器与SilverLight 通信的问题,本文采用开源工具Pipelight 并在Pipelight 的基础上针对PKS 体系进行适配。

通信机制分为两部分:数据传输和函数调用分发。数据传输通过在libpipelight.so 和pluginloader.exe 之间建立管道和设定传输格式实现。

管道的建立在初始化阶段完成。当访问嵌有Silver-Light 的网页时,浏览器会调用libpipelight.so 中的attach函数,完成配置文件的加载、插件的安装检查、pluginloader.exe 的调用和插件的初始化。在管道的两端分别使用fread 函数和fwrite 函数实现数据的读写功能。

Pipelight 设定每次传输的内容由命令和数据构成,如图3 所示。每条命令共4 个字节,其中第1 个字节代表命令类型,后面3 个字节代表数据长度,单位是字节。命令后紧接着传输具体数据,数据的最大长度是0xFFFFFF 字节。在Pipelight 中命令类型是一个枚举类型,一共有9 种枚举值,每个枚举值都有对应的含义,例如图3 中的0x02 表示传输32 位有符号数。

图3 数据传输格式

在传输数据的过程中发现,当遇到某些特殊字节时会出现传输错误的情况,例如:发送端发送0x0A,接收端接收到0x0A0D。因此在传输命令和具体数据之前需要分别对其按字节处理并传输相应的标志数据(Flag)和位置数据(Site)。传输顺序如图4 所示。接收端同样按照这个顺序接收命令和数据,对于有特殊情况的字节要做相应的还原处理。当第i个字节出现特殊情况,处理方法如下:

图4 数据传输顺序

(1)发送端:

(2)接收端:

函数调用分发主要由栈、函数枚举和命令类型实现。当出现函数调用的情况时,调用方将函数参数从右往左依次传输到管道中,并传输调用的函数枚举值。被调用方依次接收函数参数并将参数存入栈中,当接收到函数枚举值时会调用相应的函数。在函数执行完毕后,被调用方将执行结果传输到管道中并向管道传输一个函数返回的命令。在这过程中,栈主要负责暂存函数参数和返回值;命令类型主要负责将函数调用、参数和函数返回区分开。在9 种命令类型中BLOCKMCD_CALL_DIRECT 表示函数调用,随后接收的数据是函数枚举值;BLOCKMCD_RETURN 表示函数返回,随后无需从管道读取数据;其余命令类型分别表示接收的数据类型,用于从管道中读取参数并存入栈中。

葛立方的笔记,由左思、陶潜的诗说起,对于两位诗人贬低荆轲人格,予以纠正,并指出均出自于以成败论人之庸俗历史观。这是作者的高明之处,值得赞赏。然而,在他指责太子丹催促荆轲出发行刺而导致了荆轲之失败,并谓“概之于义,虽得秦王之首,于燕亦未能保终吉也”之时,同样犯了以成败论人的痼疾。至于举汉代扬雄之言,斥荆轲无义,并视其为后代黑幕刺客之绪,则更为无稽。盖扬雄身处排斥游士的汉代,处禁锢日深,站在时代的立场,自然要非议荆轲,反对复仇;何况扬雄信奉古文经学,与今文经学有隔。故此,扬雄反感以公羊学为思想基础的作品及其所塑造出来的人物。

当浏览器调用NP 或NPP 函数时,libpipelight.so 负责将函数调用转发到pluginloader.exe,由pluginloader.exe 调用DLL 中相应的NPP 和NP 函数。当插件调用NPN 函数时,pluginloader.exe 负责将函数调用转发到libpipelight.so,由libpipelight.so 调用浏览器的NPN 函数。例如:浏览器调用libpipelight.so 的NPP_StreamAs-File函数,经libpipelight.so 转发到pluginloader.exe,由pluginloader.exe 调用DLL 中的NPP_StreamAsFile 函数。

2.4 实验对比

本次实验将本文提出的方案和另外两种解决方案从系统内存消耗、运行速度等方面做对比,结果如图5、图6 所示。

图5 系统内存消耗实验结果

图6 运行速度实验结果

2.4.1 方案设定

方案1:在宿主机中安装Qemu 环境并创建Windows虚拟机,在虚拟机中访问嵌有SilverLight 插件的页面。

方案2:在Wine 中安装并运行FireFox 浏览器,通过FireFox 浏览器访问嵌有SilverLight 插件的页面。

方案3:本文提出的方案。

本次实验在一台PKS 终端机上进行,终端机为8 核CPU、16 GB 内存。三个方案中使用到的软件信息如表1 所示。

表1 实验环境一览表

2.4.3 结果分析

如图5 所示,在系统内存消耗方面,方案3 占用系统内存最少,是方案1 消耗量的20%、方案2 消耗量的79%。

运行速度主要分为两方面:一是访问目标页面时,页面加载的时长;二是页面加载完毕后,用户在页面中进行一次点击操作时,页面的响应时长。如图6 所示,无论是页面加载时长还是点击操作时长,方案3 的运行速度都远超方案1 和方案2,尤其是在点击操作时长方面,基本没有时延。

在用户操作的简易程度方面,对于方案1 和方案2,用户都是在非宿主系统的浏览器中进行操作,而方案3在原先的浏览器中便可访问目标页面,可见方案3 的用户操作简易程度优于另外两种方案。

3 结论

本文针对PKS 体系中无法运行SilverLight 的问题,提出一套解决方案。研究Pipelight 的原理,将Pipelight和系统环境兼容层结合并根据PKS 体系进行了修改和适配,最终能在PKS 体系中运行该插件且运行速度在可接受范围内。该方案的思路同样适用于ActiveX 控件的兼容适配。这给在PKS 体系中开展相关工作提供了思路。

猜你喜欢

插件调用字节
No.8 字节跳动将推出独立出口电商APP
自编插件完善App Inventor与乐高机器人通信
核电项目物项调用管理的应用研究
No.10 “字节跳动手机”要来了?
LabWindows/CVI下基于ActiveX技术的Excel调用
简谈MC7字节码
基于jQUerY的自定义插件开发
基于系统调用的恶意软件检测技术研究
MapWindowGIS插件机制及应用
基于Revit MEP的插件制作探讨