Intro
内存管理分成两部分:
- 物理内存分配器:使得内核可以分配和释放内存。分配器以4096 bytes,即 页 为单位进行操作,另外还需要维护一个数据结构记录页面的相关信息:空闲、谁占用等。
- 内存映射:将内核和软件使用的虚拟内存地址映射为实际的物理内存地址。x86硬件的内存管理单元(memory management unit, MMU)在指令使用内存时执行映射,并查阅一组页表。
Lab2增加了一些新的源文件:
- inc/memlayout.h: 描述了必须通过修改 pmap.c 来实现的虚拟地址空间分布
- kern/pmap.c: 修改它实现虚拟地址空间分布
- kern/pmap.h: 和 memlayout.h 一起定义了
struct PageInfo
,其用于跟踪哪些物理内存页面是空闲的 - kern/kclock.h, kern/kclock.c: 操纵PC的电池供电时钟和CMOS RAM硬件,这其中的 BIOS 记录 PC 包含的物理内存量等。
pmap.c 中的代码需要读取此设备硬件以计算出有多少物理内存,但这部分代码已经写好了,不需要再去了解CMOS硬件的工作细节。
物理内存页管理
操作系统必须跟踪记录物理内存是空闲还是使用中,此课程的JOS使用 页 作为管理内存的 粒度,以便它可以使用MMU来映射和保护每一块分配的内存。
Exercise1:
- 完善
kern/pmap.c
中的函数:boot_alloc(), mem_init(), page_init(), page_alloc(), page_free()
。check_page_free_list()
和check_page_alloc()
两个函数将会检测你写的页分配器代码是否正确。