Yanyan's Wiki 软件工程研究入门 (2022)

本周阅读材料

教科书

教科书 Operating Systems: Three Easy Pieces:

  • 第 3 章 - Dialogue
  • 第 4 章 - Process
  • 第 5 章 - Process API
  • 第 13 章 - Address Spaces
  • 第 14 章 - Memory API

阅读理解示例代码

我们的课堂上同样有很多值得大家注意的示例代码,值得大家亲自尝试、调试、观察 trace:

  • 建议大家绘制 fork-demo.c 的状态机,这个程序的输出并不 trivial,在你绘制过状态机以后,你会发现你对 “父子进程” 的理解变深了。fork-printf.c 则从另一个方面展示了 fork “状态机复制” 的真正含义——操作系统看不见库函数,因此任何内存,包括库函数中的缓冲区都会被原样复制。
  • execve-demo.c 为大家解释了 main 函数的参数是如何而来的。
  • 你可以用 thread.h 创建更多的线程,并仿照 exit-demo.c 执行系统调用,看如何细粒度地控制线程/进程的终止。

关于进程的地址空间,我们展示了 minimal.S 和静态/动态链接 Hello World 程序的地址空间,请跟随课堂上的演示,亲手去理解进程的地址空间。

  • mmap-alloc.cmmap-disk.py 分别展示了用 mmap 分配内存、映射设备的例子。你也可以试着把一个普通的文件,例如 a.txt 使用 mmap 映射并修改。

在我们的 “游戏修改器” dosbox-hack.c 中,我们展示了一些库函数的使用,例如 popen、open 等,以及我们使用了文件 API 在打开的文件中移动 “光标” 从而实现另一个进程的读写。Windows 提供了另一套封装得更好的 API,因此从某种程度上,在 Windows 上实现游戏修改器是更容易的。金山游侠成功的另一个秘诀是可以在游戏中直接唤起而不需要切出,这个实现就类似于游戏外挂 (变速齿轮) 了。你可以参考课堂上的 hooking 代码 dsu.c

(开启钞能力的《命令与征服》)
Creative Commons License    苏 ICP 备 2020049101 号