资讯专栏INFORMATION COLUMN

[译]WebAssembly 中的 Memory

junnplus / 1650人阅读

摘要:使用,您可以直接访问原始字节码这可能令人担忧。可以根据索引从中拿到字符串现在,很多人并不知道如何在中使用字节码。你需要将字节码转换为有用的内容,比如说字符串。通过防止浏览器级内存泄漏并提供内存隔离,使事情变得更安全。

原文链接:https://fanmingfei.com/posts/...

这是系列文章第二篇:

使用 JavaScript 创建一个 WebAssembly 模块的实例。

WebAssembly 中的 Memory

什么是 WebAssembly table?

WebAssembly中的内存与JavaScript中的内存有所不同。使用WebAssembly,您可以直接访问原始字节码...这可能令人担忧。但是,它的确比你想象中的要安全。

什么是 memory 对象?

当 WebAssembly 模块被实例化时,它需要一个 memory 对象。你可以创建一个新的WebAssembly.Memory并传递该对象。如果没有创建 memory 对象,在模块实例化的时候将会自动创建,并且传递给实例。

JS引擎创建一个ArrayBuffer(我在另一篇文章中解释)来做这件事情。ArrayBuffer 是 JS 引用的 JavaScript 对象。JS 为你分配内存。你告诉它需要多少内存,它会创建一个对应大小的ArrayBuffer。

数组的索引可以视为内存地址。如果你需要增加它的内存,你可以使用 grow 方法让数组变大。

ArrayBuffer 做了两件事情,一件是做 WebAssembly 的内存,另外一件是做 JavaScript 的对象。

它使 JS 和 WebAssembly 之间传递内容更方便。

使内存管理更安全。

JS 和 WebAssembly 之间传值

因为 ArrayBuffer 是一个 JavaScript 对象,这意味着 JavaScript 也可以获取到这个 memory 中的字节。所以通过这种方式, WebAssembly 和 JavaScript 可以共享内存,并且相互传值。

使用数组索引来访问每个字节,而不是使用内存地址。

比如,WebAssembly 想将一个字符串写入内存。它需要将字符串转换成字节码。

然后把这些字节码放进数组。

然后将字符串所在的内存位置的第一个位置,也就是数组的某个索引,传递给 JavaScript。JavaScript 可以根据索引从 ArrayBuffer 中拿到字符串

现在,很多人并不知道如何在 JavaScript 中使用字节码。你需要将字节码转换为有用的内容,比如说字符串。

在一些浏览器中,你可以使用TextDecoder和TextEncoderAPI来处理。或者你可以在你的js文件里添加一些帮助函数。比如,Emscripten就可以帮你添加编码和解码的方法。

所以,WebAssembly memory 最好的地方就是它是一个 JS 对象。WebAssembly 和 JavaScript 可以直接使用 memory 互相传值。

让 memory 存取更安全

另外一个好处是,WebAssembly memory 只是一个 JavaScript 对象:安全。通过防止浏览器级内存泄漏并提供内存隔离,使事情变得更安全。

内存泄漏

正如我在内存管理的文章中提到的,当你管理自己的内存时,你可能会忘记清除它。这可能导致系统内存不足。

如果 WebAssembly 模块实例直接访问内存,并且如果在超出范围之前忘记清除该内存,那么浏览器可能会泄漏内存。

因为内存对象只是一个JavaScript对象,所以它本身就被垃圾回收器跟踪(尽管它的内容不会垃圾回收)。

也就是说,WebAssembly 实例被移除以后,所有的内存数组将会被回收。

内存隔离

当人们听到WebAssembly让你直接访问内存时,他们可能有点紧张。他们认为,一个恶意的 WebAssembly 模块可能会进入并在内存中干坏事,这是绝对不允许的。但事实并非如此。

ArrayBuffer 提供了边界。WebAssembly 模块可以直接管理的内存是受限制的。

它可以直接管理该数组内部的字节,但它看不到任何超出此数组范围的内容。

例如,内存中的任何其它 JS 对象,如 window 对象,WebAssembly无法访问。这对安全性非常重要。

每当 WebAssembly 中有操作内存时,引擎会进行数组限制检查,以确保该地址位于 WebAssembly 实例的内存中。

如果代码尝试访问超出范围的地址,引擎将抛出异常。这保护了其它的内存。

所以这就是 memory 相关的内容。在下一篇文章中,我们将看研究一些关于安全性的其它类型的 import 数据:table import。

About

Lin Clark

Lin 是Mozilla Developer Relations团队的工程师。她使用 JavaScript、WebAssembly、Rust 和 Servo,也画一些漫画。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84511.html

相关文章

  • []使用JavaScript创建一个WebAssembly模块的实例

    摘要:原文链接这是系列文章第一篇使用创建一个模块的实例。将会创建模块的实例。一旦模块实例化完成,主进程就会拿到返回的实例。如果创建一个实例,你还需要其它的参数。使用这些低级装备这些来构建实例。模块本身没有任何状态。 原文链接:https://fanmingfei.com/posts/... 这是系列文章第一篇: 使用 JavaScript 创建一个 WebAssembly 模块的实例。 W...

    elarity 评论0 收藏0
  • []什么是 WebAssembly table imports?

    摘要:中的什么是在第一篇文章中,我介绍了可以导入的四中不同的类型。可能是以某种方式插入到内存中的恶意代码,可能嵌入到字符串中。是存在于内存之外的数组。如果模块想要调用这些函数,它将该索引传递给一个名为的操作。 原文链接: https://fanmingfei.com/posts/... 这是系列文章第三篇: 使用 JavaScript 创建一个 WebAssembly 模块的实例。 Web...

    Java_oldboy 评论0 收藏0
  • WebAssembly 初尝

    摘要:在当前阶段,仅仅只是字节码规范。如果都没有将代码编译为字节码的工具,要起步就很困难了。接下来要做的是使用将格式的代码转换为二进制码。运行文件,最后就能得到浏览器需要的真正的二进制码。 本文转载自:众成翻译译者:文蔺链接:http://www.zcfy.cc/article/1031原文:http://cultureofdevelopment.com/blog/build-your-fi...

    anonymoussf 评论0 收藏0
  • 」内存管理碰撞课程

    摘要:你可以从内存中直接拿东西,也可以直接往内存里存东西当你把或者其它语言编译为时,编译工具会在里增加一些辅助代码。 作者:Lin Clark 译者:Cody Chan 原帖链接:A crash course in memory management 这是图解 SharedArrayBuffers 系列的第一篇: 内存管理碰撞课程 图解 ArrayBuffers 和 SharedA...

    BDEEFE 评论0 收藏0
  • 2017-07-22 前端日报

    摘要:前端日报精选任何网站都可以变成但我们需要做得更好译高性能个新工具加速你的应用在生产环境中使用记录日志手把手教你用开发一个发布中文译继承实例译基于背后的合理化,而非设计掘金实现哪家强中的众成翻译快速入门个人文章一个基于区块链的深网 2017-07-22 前端日报 精选 任何网站都可以变成 PWA —— 但我们需要做得更好[译] 高性能 React:3 个新工具加速你的应用在生产环境中使用...

    endless_road 评论0 收藏0

发表评论

0条评论

junnplus

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<