webassembly 如何提供软件故障隔离
how webassembly provides software fault isolation
到处都能听到 webassembly 提供的隔离。他们告诉 webassembly 提供了细粒度的软件故障隔离。但它如何提供隔离?线性记忆?线性内存是如何隔离的?我找不到关于 webassembly 如何提供 SFI(软件故障隔离)的资源。
在规范级别,“线性内存”是 WebAssembly 程序可以通过其加载和存储指令访问的唯一 space。确保这是真的是 WebAssembly VM 的工作,只要符合规范,它就可以以任何方式自由执行此操作。在我工作的虚拟机 Wasmer 中,指向线性内存的指针是基指针的 32 位偏移量,默认情况下我们分配 6GiB 的虚拟地址,以便所有可能的指针访问都落在线性内存中(从 -2GiB 到 +4GiB ,因此是 6GiB)。其中一些地址被映射为不可访问,因此根据 Wasm 规范的要求,对它们的访问会导致陷阱。没有必要以这种方式实现线性内存,你可以编写一个 WebAssembly VM,它使用哈希表进行线性内存访问(key=address,value=byte),只要它正确实现,任何程序都不应该知道。
关于 SFI 的更广泛主题,我在 Whosebug 的其他地方回答了这个问题的变体。 .
到处都能听到 webassembly 提供的隔离。他们告诉 webassembly 提供了细粒度的软件故障隔离。但它如何提供隔离?线性记忆?线性内存是如何隔离的?我找不到关于 webassembly 如何提供 SFI(软件故障隔离)的资源。
在规范级别,“线性内存”是 WebAssembly 程序可以通过其加载和存储指令访问的唯一 space。确保这是真的是 WebAssembly VM 的工作,只要符合规范,它就可以以任何方式自由执行此操作。在我工作的虚拟机 Wasmer 中,指向线性内存的指针是基指针的 32 位偏移量,默认情况下我们分配 6GiB 的虚拟地址,以便所有可能的指针访问都落在线性内存中(从 -2GiB 到 +4GiB ,因此是 6GiB)。其中一些地址被映射为不可访问,因此根据 Wasm 规范的要求,对它们的访问会导致陷阱。没有必要以这种方式实现线性内存,你可以编写一个 WebAssembly VM,它使用哈希表进行线性内存访问(key=address,value=byte),只要它正确实现,任何程序都不应该知道。
关于 SFI 的更广泛主题,我在 Whosebug 的其他地方回答了这个问题的变体。