## /proc/self/mem:内核访问与硬件限制 - 摘要
`/proc/*/mem` 伪文件表现出不同寻常的“穿透”语义——即使虚拟内存被标记为不可写,它也允许写入,这是 Julia 和 rr 等工具有意使用的特性。 这引发了关于内核内存访问硬件限制的问题。
这种行为的核心在于内核实现 `/proc/self/mem` 的方式。 它通过将用户空间虚拟地址转换为物理帧,然后将该帧以可写权限重新映射到内核地址空间来绕过硬件强制的写保护(由 CPU 标志如 CR0.WP 和 SMAP 控制)。 基本上,内核并不直接访问用户的内存;它将其复制到自己的可写空间进行修改。
这是通过 `get_user_pages_remote()`、`kmap()` 和 `copy_to_user_page()` 等函数实现的,`FOLL_FORCE` 标志会覆盖典型的访问验证。 关键要点是,内存权限与用于访问的*虚拟地址*相关联,而不是底层的物理内存。
最终,CPU 提供了约束,但内核对虚拟内存子系统的控制使其能够规避这些约束,展示了一种细微的关系,即硬件设置了潜在的限制,但内核拥有驾驭这些限制的手段。
这个项目模拟了自我复制程序的出现,灵感来自“计算生命”论文。它使用一个240x135的网格,其中填充着类似Brainfuck的短程序(每个程序约64条指令)。这些程序通过随机配对、组合代码、执行(在一定限制内)然后分裂来相互作用,从而实现变异和潜在的自我复制。
该模拟展示了从随机开始,能够复制自己的程序可以自发出现。在这个特定的运行中,一个自我复制器迅速占领了网格,但随后被一个*更*高效的复制器超越,最终完全控制了局面。可视化将每条指令表示为一个彩色像素,黑色代表数据,8x8块代表单个程序,从而视觉上追踪这些计算生命体的传播和演化。