操作系统真象还原第八章

8.1 makefile 简介

8.1.1 makefile 是什么

make 命令可以自动找出变更的文件,并根据依赖关系,找出受变更文件影响的其它相关文件,然后对这些文件按照规则进行单独处理。

makefile 文件是 make 程序的搭档,它们发现某个文件更新后,只编译该文件和受该文件影响的相关文件,其它不受影响的文件不重新编译,从而提高了编译效率。

8.1.4 伪目标

make 规定,当规则中不存在依赖文件时,这个目标文件名就称为伪目标。

为了避免伪目标和真实目标文件同名的情况,可以用关键字“.PHONY”来修饰伪目标,格式为".PHONY:伪目标名"。这样不管与伪目标同名的文件是否存在,make 照样执行伪目标处的命令。

操作系统真象还原第八章

8.1.6 自定义变量与系统变量

makefile 中定义变量的格式是: 变量名 = 值(字符串)。

变量引用的格式: $(变量名)。

操作系统真象还原第八章

8.1.7 隐含规则

在编写规则时,若一行写不下,可以在行尾添加反斜杠字符 ‘\’,这样下一行的内容便被认为是同一行。

makefile 中用 # 来单行注释。

隐含规则:对于一些使用频率非常高的规则,make 把它们当成是默认的,不需要显式地写出来,当用户未在 makefile 中显式定义规则时,将默认使用隐含规则进行推导。

隐含规则只限于那些编译过程中基本固定的依赖关系,比如 C 语言代码文件扩展名为 .c,编译生成的目标文件扩展名是 .o。

常见的部分语言程序的隐含规则:

  • C 程序

    x.o 的生成依赖于 x.c

  • C++ 程序

    x.o 的生成依赖于 x.cc 或者 x.C

  • Pascal 程序

    x.o 的生成依赖于 x.p

8.1.7 自动化变量

@ , 表 示 规 则 中 的 目 标 文 件 名 集 合 , 如 果 存 在 多 个 目 标 文 件 , @,表示规则中的目标文件名集合,如果存在多个目标文件, @@ 则表示其中每一个文件名。

$<,表示规则中依赖文件的第 1 个文件。

$^,表示规则中所有依赖文件的集合,如果集合中有重复的文件,会自动去重。

$?,表示规则中,所有比目标文件 mtime 更新的依赖文件集合。

8.1.9 模式规则

% 用来匹配任意多个非空字符。比如 %.o 代表所有以 .o 为结尾的文件,g%.o 是以字符 g 开头的所有以 .o 为结尾的文件,make 会拿这个字符串模式去文件系统上查找文件,默认为当前路径下。

8.4 位图 bitmap 及其函数的实现

8.4.1 位图简介

位图相当于一组资源的映射。位图中的每一位和被管理的单位资源都是一对一的关系,故位图主要用于管理容量较大的资源。

8.5 内存管理系统

8.5.1 内存池规划

由于在分页机制下有了虚拟地址和物理地址,为了有效管理它们,需要创建虚拟内存地址池和物理内存地址池。

内存池中管理的是一个个大小为 4KB 的内存块。

当内核申请内存时,从内核自己的虚拟地址池中分配虚拟地址,再从内核物理内存池中分配物理内存,然后内核自己的页表将这两种地址建立好映射关系。

当用户进程申请内存时,操作系统先从用户进程自己的虚拟地址池中分配空闲虚拟地址,然后再从用户物理地址池中分配空闲的物理内存,然后在该用户进程自己的页表将这两种地址建立好映射关系。

操作系统真象还原第八章