背景回顾:Linux 从一个初始的程序 (状态机) 开始,构建出了整个应用程序世界——通过 fork, execve, exit,我们可以在操作系统中创建出很多并发/并行执行的程序。
本讲内容:在我们的状态机模型中,进程的状态由内存和寄存器组成。寄存器是非常明确的,gdb 中 info registers 即可查看。但进程 “平坦” 的地址空间 () 里到底有什么,以及我们是否可以 “入侵” 另一个进程的地址空间?
状态机的视角自然地将我们引入 “内存到底是什么” 的问题——它的答案同样也很自然:带有访问权限控制的连续内存段。我们可以通过 mmap、munmap、mprotect 三个系统调用调整状态机的地址空间,包括分配匿名的内存、映射文件内容到内存、修改访问权限等。更有趣的是操作系统有 “能够实现一切应用程序” 的需求,调试器也不在话下——这也给了我们入侵其他进程地址空间的机制。
教科书 Operating Systems: Three Easy Pieces: