摘要:使用,您可以直接訪問原始字節(jié)碼這可能令人擔(dān)憂。可以根據(jù)索引從中拿到字符串現(xiàn)在,很多人并不知道如何在中使用字節(jié)碼。你需要將字節(jié)碼轉(zhuǎn)換為有用的內(nèi)容,比如說字符串。通過防止瀏覽器級內(nèi)存泄漏并提供內(nèi)存隔離,使事情變得更安全。
原文鏈接:https://fanmingfei.com/posts/...
這是系列文章第二篇:
使用 JavaScript 創(chuàng)建一個 WebAssembly 模塊的實例。
WebAssembly 中的 Memory
什么是 WebAssembly table?
WebAssembly中的內(nèi)存與JavaScript中的內(nèi)存有所不同。使用WebAssembly,您可以直接訪問原始字節(jié)碼...這可能令人擔(dān)憂。但是,它的確比你想象中的要安全。
什么是 memory 對象?當(dāng) WebAssembly 模塊被實例化時,它需要一個 memory 對象。你可以創(chuàng)建一個新的WebAssembly.Memory并傳遞該對象。如果沒有創(chuàng)建 memory 對象,在模塊實例化的時候?qū)詣觿?chuàng)建,并且傳遞給實例。
JS引擎創(chuàng)建一個ArrayBuffer(我在另一篇文章中解釋)來做這件事情。ArrayBuffer 是 JS 引用的 JavaScript 對象。JS 為你分配內(nèi)存。你告訴它需要多少內(nèi)存,它會創(chuàng)建一個對應(yīng)大小的ArrayBuffer。
數(shù)組的索引可以視為內(nèi)存地址。如果你需要增加它的內(nèi)存,你可以使用 grow 方法讓數(shù)組變大。
ArrayBuffer 做了兩件事情,一件是做 WebAssembly 的內(nèi)存,另外一件是做 JavaScript 的對象。
它使 JS 和 WebAssembly 之間傳遞內(nèi)容更方便。
使內(nèi)存管理更安全。
JS 和 WebAssembly 之間傳值因為 ArrayBuffer 是一個 JavaScript 對象,這意味著 JavaScript 也可以獲取到這個 memory 中的字節(jié)。所以通過這種方式, WebAssembly 和 JavaScript 可以共享內(nèi)存,并且相互傳值。
使用數(shù)組索引來訪問每個字節(jié),而不是使用內(nèi)存地址。
比如,WebAssembly 想將一個字符串寫入內(nèi)存。它需要將字符串轉(zhuǎn)換成字節(jié)碼。
然后把這些字節(jié)碼放進數(shù)組。
然后將字符串所在的內(nèi)存位置的第一個位置,也就是數(shù)組的某個索引,傳遞給 JavaScript。JavaScript 可以根據(jù)索引從 ArrayBuffer 中拿到字符串
現(xiàn)在,很多人并不知道如何在 JavaScript 中使用字節(jié)碼。你需要將字節(jié)碼轉(zhuǎn)換為有用的內(nèi)容,比如說字符串。
在一些瀏覽器中,你可以使用TextDecoder和TextEncoderAPI來處理。或者你可以在你的js文件里添加一些幫助函數(shù)。比如,Emscripten就可以幫你添加編碼和解碼的方法。
所以,WebAssembly memory 最好的地方就是它是一個 JS 對象。WebAssembly 和 JavaScript 可以直接使用 memory 互相傳值。
讓 memory 存取更安全另外一個好處是,WebAssembly memory 只是一個 JavaScript 對象:安全。通過防止瀏覽器級內(nèi)存泄漏并提供內(nèi)存隔離,使事情變得更安全。
內(nèi)存泄漏正如我在內(nèi)存管理的文章中提到的,當(dāng)你管理自己的內(nèi)存時,你可能會忘記清除它。這可能導(dǎo)致系統(tǒng)內(nèi)存不足。
如果 WebAssembly 模塊實例直接訪問內(nèi)存,并且如果在超出范圍之前忘記清除該內(nèi)存,那么瀏覽器可能會泄漏內(nèi)存。
因為內(nèi)存對象只是一個JavaScript對象,所以它本身就被垃圾回收器跟蹤(盡管它的內(nèi)容不會垃圾回收)。
也就是說,WebAssembly 實例被移除以后,所有的內(nèi)存數(shù)組將會被回收。
內(nèi)存隔離當(dāng)人們聽到WebAssembly讓你直接訪問內(nèi)存時,他們可能有點緊張。他們認為,一個惡意的 WebAssembly 模塊可能會進入并在內(nèi)存中干壞事,這是絕對不允許的。但事實并非如此。
ArrayBuffer 提供了邊界。WebAssembly 模塊可以直接管理的內(nèi)存是受限制的。
它可以直接管理該數(shù)組內(nèi)部的字節(jié),但它看不到任何超出此數(shù)組范圍的內(nèi)容。
例如,內(nèi)存中的任何其它 JS 對象,如 window 對象,WebAssembly無法訪問。這對安全性非常重要。
每當(dāng) WebAssembly 中有操作內(nèi)存時,引擎會進行數(shù)組限制檢查,以確保該地址位于 WebAssembly 實例的內(nèi)存中。
如果代碼嘗試訪問超出范圍的地址,引擎將拋出異常。這保護了其它的內(nèi)存。
所以這就是 memory 相關(guān)的內(nèi)容。在下一篇文章中,我們將看研究一些關(guān)于安全性的其它類型的 import 數(shù)據(jù):table import。
AboutLin Clark
Lin 是Mozilla Developer Relations團隊的工程師。她使用 JavaScript、WebAssembly、Rust 和 Servo,也畫一些漫畫。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84511.html
摘要:原文鏈接這是系列文章第一篇使用創(chuàng)建一個模塊的實例。將會創(chuàng)建模塊的實例。一旦模塊實例化完成,主進程就會拿到返回的實例。如果創(chuàng)建一個實例,你還需要其它的參數(shù)。使用這些低級裝備這些來構(gòu)建實例。模塊本身沒有任何狀態(tài)。 原文鏈接:https://fanmingfei.com/posts/... 這是系列文章第一篇: 使用 JavaScript 創(chuàng)建一個 WebAssembly 模塊的實例。 W...
摘要:中的什么是在第一篇文章中,我介紹了可以導(dǎo)入的四中不同的類型。可能是以某種方式插入到內(nèi)存中的惡意代碼,可能嵌入到字符串中。是存在于內(nèi)存之外的數(shù)組。如果模塊想要調(diào)用這些函數(shù),它將該索引傳遞給一個名為的操作。 原文鏈接: https://fanmingfei.com/posts/... 這是系列文章第三篇: 使用 JavaScript 創(chuàng)建一個 WebAssembly 模塊的實例。 Web...
摘要:在當(dāng)前階段,僅僅只是字節(jié)碼規(guī)范。如果都沒有將代碼編譯為字節(jié)碼的工具,要起步就很困難了。接下來要做的是使用將格式的代碼轉(zhuǎn)換為二進制碼。運行文件,最后就能得到瀏覽器需要的真正的二進制碼。 本文轉(zhuǎn)載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/1031原文:http://cultureofdevelopment.com/blog/build-your-fi...
摘要:你可以從內(nèi)存中直接拿東西,也可以直接往內(nèi)存里存東西當(dāng)你把或者其它語言編譯為時,編譯工具會在里增加一些輔助代碼。 作者:Lin Clark 譯者:Cody Chan 原帖鏈接:A crash course in memory management 這是圖解 SharedArrayBuffers 系列的第一篇: 內(nèi)存管理碰撞課程 圖解 ArrayBuffers 和 SharedA...
摘要:前端日報精選任何網(wǎng)站都可以變成但我們需要做得更好譯高性能個新工具加速你的應(yīng)用在生產(chǎn)環(huán)境中使用記錄日志手把手教你用開發(fā)一個發(fā)布中文譯繼承實例譯基于背后的合理化,而非設(shè)計掘金實現(xiàn)哪家強中的眾成翻譯快速入門個人文章一個基于區(qū)塊鏈的深網(wǎng) 2017-07-22 前端日報 精選 任何網(wǎng)站都可以變成 PWA —— 但我們需要做得更好[譯] 高性能 React:3 個新工具加速你的應(yīng)用在生產(chǎn)環(huán)境中使用...
閱讀 2251·2023-04-26 01:50
閱讀 712·2021-09-22 15:20
閱讀 2590·2019-08-30 15:53
閱讀 1592·2019-08-30 12:49
閱讀 1712·2019-08-26 14:05
閱讀 2710·2019-08-26 11:42
閱讀 2306·2019-08-26 10:40
閱讀 2597·2019-08-26 10:38