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