摘要:使用,您可以直接訪問原始字節碼這可能令人擔憂。可以根據索引從中拿到字符串現在,很多人并不知道如何在中使用字節碼。你需要將字節碼轉換為有用的內容,比如說字符串。通過防止瀏覽器級內存泄漏并提供內存隔離,使事情變得更安全。
原文鏈接: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。
AboutLin Clark
Lin 是Mozilla Developer Relations團隊的工程師。她使用 JavaScript、WebAssembly、Rust 和 Servo,也畫一些漫畫。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84511.html
摘要:原文鏈接這是系列文章第一篇使用創建一個模塊的實例。將會創建模塊的實例。一旦模塊實例化完成,主進程就會拿到返回的實例。如果創建一個實例,你還需要其它的參數。使用這些低級裝備這些來構建實例。模塊本身沒有任何狀態。 原文鏈接:https://fanmingfei.com/posts/... 這是系列文章第一篇: 使用 JavaScript 創建一個 WebAssembly 模塊的實例。 W...
摘要:中的什么是在第一篇文章中,我介紹了可以導入的四中不同的類型。可能是以某種方式插入到內存中的惡意代碼,可能嵌入到字符串中。是存在于內存之外的數組。如果模塊想要調用這些函數,它將該索引傳遞給一個名為的操作。 原文鏈接: https://fanmingfei.com/posts/... 這是系列文章第三篇: 使用 JavaScript 創建一個 WebAssembly 模塊的實例。 Web...
摘要:在當前階段,僅僅只是字節碼規范。如果都沒有將代碼編譯為字節碼的工具,要起步就很困難了。接下來要做的是使用將格式的代碼轉換為二進制碼。運行文件,最后就能得到瀏覽器需要的真正的二進制碼。 本文轉載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/1031原文:http://cultureofdevelopment.com/blog/build-your-fi...
摘要:你可以從內存中直接拿東西,也可以直接往內存里存東西當你把或者其它語言編譯為時,編譯工具會在里增加一些輔助代碼。 作者:Lin Clark 譯者:Cody Chan 原帖鏈接:A crash course in memory management 這是圖解 SharedArrayBuffers 系列的第一篇: 內存管理碰撞課程 圖解 ArrayBuffers 和 SharedA...
摘要:前端日報精選任何網站都可以變成但我們需要做得更好譯高性能個新工具加速你的應用在生產環境中使用記錄日志手把手教你用開發一個發布中文譯繼承實例譯基于背后的合理化,而非設計掘金實現哪家強中的眾成翻譯快速入門個人文章一個基于區塊鏈的深網 2017-07-22 前端日報 精選 任何網站都可以變成 PWA —— 但我們需要做得更好[譯] 高性能 React:3 個新工具加速你的應用在生產環境中使用...
閱讀 2241·2023-04-26 01:50
閱讀 706·2021-09-22 15:20
閱讀 2579·2019-08-30 15:53
閱讀 1585·2019-08-30 12:49
閱讀 1704·2019-08-26 14:05
閱讀 2700·2019-08-26 11:42
閱讀 2298·2019-08-26 10:40
閱讀 2587·2019-08-26 10:38