[譯]什麼是 WebAssembly table imports?
原文地址: https://fanmingfei.com/posts/WebAssembly_Table.html
轉載請註明出處
這是系列文章第二篇:
- 使用 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 |