如何找出 WebAssembly 缓冲区的地址并将其 return 设为 Javascript?
How can I find out the address of a WebAssembly buffer and return it to Javascript?
我正在尝试获取 WebAssembly 缓冲区的内存地址并将其 return 到 Javascript,以便我可以将其内存实例化为 Javascript ArrayBuffer 并直接写入在模块内存中适当地址的数组中。
C代码:
#include <stdint.h>
uint8_t buff[10][100];
uint64_t addr(int buffer_index){
return (uint64_t)&buff[buffer_index];
}
我编译它:
emcc project.c -Os -s WASM=1 -s SIDE_MODULE=1 -o project.wasm
html:
<script>
var importObject = {
env: {
memoryBase: 0,
tableBase: 0,
setTempRet0:(x)=>{},
memory: new WebAssembly.Memory({ initial:256 }),
table: new WebAssembly.Table({ initial:0, element:'anyfunc' })
}
};
fetch('http://localhost:9000/assets/wasm/project.wasm').then(
response => response.arrayBuffer()
).then(
bytes => WebAssembly.instantiate(bytes, importObject)
).then(
results => {
let module=results.instance
let exports=module.exports
let addr=exports._addr
console.log(addr(0))
console.log(addr(1))
console.log(addr(2))
}
)
</script>
运行的结果:
project.html:21 5242880
project.html:22 5242980
project.html:23 5243080
这看起来很合理,因为缓冲区有 100 个字节的块,returned 地址相隔 100 个字节。
如何找出这些地址在模块内存中的位置?
您已通过 importObject.env.memory
为模块提供内存。您只需使用提供的偏移量/地址来检查分配给 C 代码中的 buff
变量的内存:
// create a Uint8Array as a 'view' on the module linear memory
// starting at _addr(0), and with a length of 100 elements.
var buffer = new Uint8Array(importObject.env.memory.buffer, exports._addr(0), 100);
for (var i=0; i<buffer.length; i++) {
var foo = buffer[i];
// do something with foo here!
}
您可以在 my project that renders a Mandelbrot fractal 中查看更完整的示例。
我正在尝试获取 WebAssembly 缓冲区的内存地址并将其 return 到 Javascript,以便我可以将其内存实例化为 Javascript ArrayBuffer 并直接写入在模块内存中适当地址的数组中。
C代码:
#include <stdint.h>
uint8_t buff[10][100];
uint64_t addr(int buffer_index){
return (uint64_t)&buff[buffer_index];
}
我编译它:
emcc project.c -Os -s WASM=1 -s SIDE_MODULE=1 -o project.wasm
html:
<script>
var importObject = {
env: {
memoryBase: 0,
tableBase: 0,
setTempRet0:(x)=>{},
memory: new WebAssembly.Memory({ initial:256 }),
table: new WebAssembly.Table({ initial:0, element:'anyfunc' })
}
};
fetch('http://localhost:9000/assets/wasm/project.wasm').then(
response => response.arrayBuffer()
).then(
bytes => WebAssembly.instantiate(bytes, importObject)
).then(
results => {
let module=results.instance
let exports=module.exports
let addr=exports._addr
console.log(addr(0))
console.log(addr(1))
console.log(addr(2))
}
)
</script>
运行的结果:
project.html:21 5242880
project.html:22 5242980
project.html:23 5243080
这看起来很合理,因为缓冲区有 100 个字节的块,returned 地址相隔 100 个字节。
如何找出这些地址在模块内存中的位置?
您已通过 importObject.env.memory
为模块提供内存。您只需使用提供的偏移量/地址来检查分配给 C 代码中的 buff
变量的内存:
// create a Uint8Array as a 'view' on the module linear memory
// starting at _addr(0), and with a length of 100 elements.
var buffer = new Uint8Array(importObject.env.memory.buffer, exports._addr(0), 100);
for (var i=0; i<buffer.length; i++) {
var foo = buffer[i];
// do something with foo here!
}
您可以在 my project that renders a Mandelbrot fractal 中查看更完整的示例。