这是关于作者作为业余项目开发的虚拟机 Bismuth 的系列文章中的第二篇。本文将探讨该虚拟机的内存管理和安全设计。
- 设计目标:必须快速、IR 与标准 C 兼容、可在浏览器中运行、易于实现。
- 简单即复杂:为实现简单的 VM,应像 C 语言一样,IR 分配内存时调用
malloc。但 C 语言存在可任意读取内存的问题,需进行沙盒化处理,这意味着不能使用malloc,而编写堆分配器又很复杂。 - 无人愿写堆分配器:作者虽写过多种内存分配器,但仍不愿再写,现成的 C 内存分配器也不能满足需求,高级语言使用
malloc较方便,但对于其他语言仍需自己实现。 - 以“我”的方式处理:决定用“句柄”来间接访问
malloc分配的内存,通过alloc、free、load、stor等操作来管理内存,虽有降低访问速度和使 C 指针变复杂等缺点,但仍可行。 - 生成句柄:最初用指针本身作为句柄值,但 OS 是 64 位而 VM 是 32 位,后考虑用 64 位整数作为句柄,或用递增的 32 位整数,但都存在问题,最终决定使用线性反馈移位寄存器(LFSR)生成伪随机句柄,避免了一些安全问题。
- realloc 操作:在 VM 中使用句柄,
realloc操作可调整内存大小而不改变句柄值,成功则句柄不变,失败则不影响句柄指向的内存。 - 结论:Bismuth VM 的内存管理和安全设计虽不完美,但满足了相关设计目标,易于实现,且与 C 标准兼容,速度也足够快。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。