我目前正忙于使用通过LLVM编译的WebAssembly,但我还没有设法理解堆栈/堆栈指针以及它如何与整个内存布局相关。WebAssembly堆栈/堆栈指针初始化和内存布局
我得知我必须使用s2wasm
与--allocate-stack N
使我的程序运行和我想,这基本上增加(data (i32.const 4) "8\00\00\00")
(与N = 8)到我生成一伙,与二进制部分显然是一个指针到存储器偏移量和i32常量是它在线性存储器中的偏移量。
然而,我不太明白的是,为什么指针的值是56
(同样是N = 8),以及这个值如何与内存中堆栈的确切区域相关,在我的情况下像:
0-3: zero 4-7: 56 7-35: other data sections 36-55: zeroes 56-59: zero
我知道,我是“只使用emscripten”可能更多的候选人,但我也想明白这一点。
- 堆栈指针是否始终存储在线性内存的偏移量4?
- 它的初始值是如何计算的? (在数据之后对齐到下一个偏移%16 == 0 + N)
- 之前存储了什么,以及它指向的偏移之后有什么?
谢谢您的详细解答。我想要做的是自己创建一个运行时,运行一些超级基本的C代码,我用cmake - > s2wasm - > wast2wasm编译。如您所述,malloc需要知道堆栈的位置,以便它不会对其进行分配。但它是如何知道的?假设在使用binaryen工具链时,初始堆栈指针值指向最大偏移量exclusive,VM应该将堆栈值放在 - 并且malloc可以使用超出该偏移量的所有内容时是否正确? – dcode
链接器输出'__stack_pointer',如果你指定了一个堆栈分配大小,它也会输出一个名为'.stack'的重定位。这不是唯一的方法,如果你自己推出,我建议你看看[tool-conventions](https://github.com/WebAssembly/tool-conventions/),其中包括建议使用全局为堆栈指针。 –
是否有可能通过clang/s2wasm/wasm这样的全球性产生这样的全球性?我现在结束了'int stacktop(){int * ptr; return(int)&ptr + sizeof(int *); },这可能与从JS背景来到WebAssembly的人所期望的一样愚蠢。但无论如何,感谢您的耐心! – dcode