In [1]:
from mosaic import *
OS2023(17)
17. Linux 进程的地址空间¶
Changelog & 反馈
- 周日调休上课 (上周二的课)
- L2/M3 代码发布 (Deadline: 5.14)
- 为什么给那么长时间?是因为真的需要那么长时间做
背景回顾:Linux 从一个初始的程序 (状态机) 开始,构建出了整个应用程序世界——通过 fork, execve, exit,我们可以在操作系统中创建出很多并发/并行执行的程序。
本讲内容:在我们的状态机模型中,进程的状态由 $(M, R)$ 两部分组成;其中 $R$ (register) 是由体系结构决定的,而 $M$ (memory) 则还有一些未解开的谜题:程序在初始时,并不是所有的内存都可以访问的,但我们却又的确可以申请很大的内存。这是如何实现的?
- 进程的地址空间
- mmap 系统调用
- 三类游戏外挂的实现原理
- 金山游侠:内存修改
- 按键精灵:GUI 事件发送
- 变速齿轮:代码注入
In [2]:
slideshow('17.1')
In [3]:
demo('minimal', 'i/minimal')
In [4]:
slideshow('17.2')
In [5]:
demo('mmap-alloc', 'v/mmap-alloc.c')
In [6]:
slideshow('17.3')
In [7]:
demo('knight', 'v/knight.c')
In [8]:
demo('hack', 'v/hack')
技术,无论是计算机系统、编程语言还是人工智能,都是给人类带来福祉的。但越强大的技术就也有越 “负面” 的用途。使用游戏外挂破坏游戏的平衡性、利用漏洞入侵计算机系统,或是用任何技术占他人之先、损害他人的利益,都是一件可耻的事情。同样,如果你希望在人生这场 game (博弈) 中走得更远,我们也希望 “诚朴雄伟” 是每个南大人的气质。
Take-away Messages¶
状态机的视角自然地将我们引入 “内存到底是什么” 的问题——它的答案同样也很自然:带有访问权限控制的连续内存段。我们可以通过 mmap、munmap、mprotect 三个系统调用调整状态机的地址空间,包括分配匿名的内存、映射文件内容到内存、修改访问权限等。更有趣的是操作系统有 “兼容一切应用程序” 的需求,调试器也不在话下——这也给了我们入侵其他进程地址空间的机制。
课后习题/编程作业¶
1. 阅读材料¶
教科书 Operating Systems: Three Easy Pieces:
- 第 12 章 - Dialogue
- 第 13 章 - Address Spaces
- 第 14 章 - Memory API
2. 编程实践¶
进程地址空间管理是理解现代操作系统 API 的核心内容。务必在你的计算机上重现本次课代码内容并确保你理解它们 (必要时需要借助调试器)。