问题描述
无论你在哪里听到 webassembly 提供的隔离。他们告诉 webassembly 提供细粒度的软件故障隔离。但它如何提供隔离?线性记忆?线性内存是如何隔离的?我找不到有关 webassembly 如何提供 SFI(软件故障隔离)的资源。
解决方法
在规范级别,“线性内存”是 WebAssembly 程序可以通过其加载和存储指令访问的唯一空间。确保这是真的是 WebAssembly VM 的工作,只要它符合规范,它就可以以任何方式自由地做到这一点。在我工作的 VM 中,Wasmer,指向线性内存的指针是基指针的 32 位偏移量,默认情况下我们分配 6GiB 的虚拟地址,以便所有可能的指针访问都落在线性内存中(从 -2GiB 到 +4GiB ,因此为 6GiB)。其中一些地址被映射为不可访问,因此对它们的访问会导致 Wasm 规范要求的陷阱。没有必要以这种方式实现线性内存,您可以编写一个 WebAssembly VM,它使用哈希表进行线性内存访问(键=地址,值=字节),只要它正确实现,任何程序都不应该能够分辨。>
关于更广泛的 SFI 主题,我在 StackOverflow 的其他地方回答了这个问题的一个变体。 Why is WebAssembly safe and what is linear memory model .