標籤:

[譯]什麼是 WebAssembly table imports?

原文地址: fanmingfei.com/posts/We

轉載請註明出處

這是系列文章第二篇:

  • 使用 JavaScript 創建一個 WebAssembly 模塊的實例。
  • WebAssembly 中的 Memory
  • 什麼是 WebAssembly table?

在第一篇文章中,我介紹了 WebAssembly 可以導入的四中不同的類型。

  • values
  • function
  • memory
  • tables

最後一個可能有點陌生。什麼是 table import,它有什麼用呢?

有時在程序中,你想要有一個變數指向一個函數,就像一個回調。然後你可以把它傳遞給其他的方法。

在 C 語言中,這叫做函數指針。函數存在內存中。變數,函數指針,只是指向該內存地址。

如果需要,以後可以將變數指向一個不同的函數。這應該是一個熟悉的概念。

在 web 頁面中,所有的方法都是 JavaScript 對象而且由於它們是 JavaScript 對象,所以它們存在於 WebAssembly 內存之外的內存地址中。

如果我們想要一個指向其中一個函數的變數,我們需要把它的地址放在我們的內存中。

保證網頁安全的一部分是保證內存地址的不可見。你不希望頁面上的代碼可以看到或操作這些內存地址。如果頁面上有惡意代碼,它可以使用修改內存來創建漏洞。

例如,它可能會更改你的內存地址,以指向不同的內存位置。

那麼當你嘗試調用這個函數的時候,你會載入攻擊者給你的內存地址。

可能是以某種方式插入到內存中的惡意代碼,可能嵌入到字元串中。

Tables 可能實現類似函數指針的東西,這樣不容易受到這些攻擊的影響。

Table 是存在於 WebAssembly 內存之外的數組。它的值是對函數的引用。

這些引用包含內存地址,但由於它不在 WebAssembly 的內存中,WebAssembly 不能看到這些地址。

但它確實可以訪問數組索引。

如果 WebAssembly 模塊想要調用這些函數,它將該索引傳遞給一個名為call_indirect的操作。這樣就可以調用函數了。

現在,Table 的用例非常有限。它被添加到用於支持函數指針的規範中,因為C/C++非常依賴函數指針。

所以,當前唯一可以使用table來引用的只有函數但是隨著WebAssembly擴展的功能,例如,當添加對DOM的直接訪問時,你可能將會看到Table上存儲著其他的類型的引用,和除了call_indirect之外的操作。

About

Lin Clark

Lin 是Mozilla Developer Relations團隊的工程師。她使用 JavaScript、WebAssembly、Rust 和 Servo,也畫一些漫畫。


推薦閱讀:

WebAssembly 系列(三)編譯器如何生成彙編
什麼是 WebAssembly table
U4 內核 WebGL 支持發展方向

TAG:WebAssembly |