15. 进程的地址空间

背景回顾:Linux 从一个初始的程序 (状态机) 开始,构建出了整个应用程序世界——通过 fork, execve, exit,我们可以在操作系统中创建出很多并发/并行执行的程序。

本讲内容:在我们的状态机模型中,进程的状态由内存和寄存器组成。寄存器是非常明确的,gdb 中 info registers 即可查看。但进程 “平坦” 的地址空间 (026410 \ldots 2^{64}-1) 里到底有什么,以及我们是否可以 “入侵” 另一个进程的地址空间?

15.1 进程的地址空间

15.2 入侵进程地址空间

15.3 给进程发送 GUI 事件

15.4 改变进程对时间的感知

Take-away Messages

状态机的视角自然地将我们引入 “内存到底是什么” 的问题——它的答案同样也很自然:带有访问权限控制的连续内存段。我们可以通过 mmap、munmap、mprotect 三个系统调用调整状态机的地址空间,包括分配匿名的内存、映射文件内容到内存、修改访问权限等。更有趣的是操作系统有 “能够实现一切应用程序” 的需求,调试器也不在话下——这也给了我们入侵其他进程地址空间的机制。

课后习题/编程作业

1. 阅读材料

📚阅读材料

教科书 Operating Systems: Three Easy Pieces

  • 第 12 章 - Dialogue
  • 第 13 章 - Address Spaces
  • 第 14 章 - Memory API