0%

xv6-lab2-内存管理部分

Introduction

这部分开始写内存管理。内存管理有两部分:分配内存空间(编写一个数据结构能够知道哪些页是空闲的、哪些页是独享的、哪些页是共享的)和进行虚拟内存的管理(映射关系)。

本lab新增了下面这些文件:

  • inc/memlayout.h:用来描绘了虚拟内存的分布。
  • kern/pmap.c
  • kern/pmap.h
  • kern/kclock.h
  • kern/kclock.c

Part 1: Physical Page Management

操作系统必须知道物理内存中,哪些是空闲的,哪些是可用的。首先需要先编写物理页面的分配器。每一个页抽象成一个struct PageInfo,然后利用链表连接在一起。

练习1:按照顺序完成下面这些函数:

1
2
3
4
5
boot_alloc()`
`mem_init()` (only up to the call to `check_page_free_list(1)`)
`page_init()`
`page_alloc()`
`page_free()

显然boot_alloc是在我们还没有建立起内存管理的时候所使用的,这里先不提。

然后就是mem_init用来初始化内存,里面有一个i386_detect_memory();函数,仔细跟踪到这个函数,我们可以发现其实就是用来统计物理内存的多少的。而物理内存其实被分成了三块:0x000000xA0000的basemem;0xA00000x100000被用来给外部IO设备了;0x100000~内存上限,是最主要且最庞大的内存空间,也叫extmem。