MIT6.828 | Lab 2: Memory Management

LINK

引言

本次实验将编写操作系统的内存管理代码,分为两个部分:

  • 第一部分是内核的物理内存分配器,使内核能够分配和释放内存。 你的分配器将以4096字节为单位工作,称为page。 你的任务是
    • 维持一个记录page分配状态的数据结构
    • 多少进程正在共享每一个分配的page
    • 编写分配和释放page的程序
  • 第二部分是虚拟内存,它将内核和用户软件使用的虚拟地址映射到物理内存中的地址。 当指令使用内存时,x86硬件的内存管理单元(MMU)执行映射,查询一组page table。 您需要根据我们提供的规格修改JOS设置MMU的页面
1
2
3
$ git checkout -b lab2 origin/lab2
$ git merge lab1

Lab2 包含以下新文件:

  • inc/memlayout.h
  • kern/pmap.c
  • kern/pmap.h
  • kern/kclock.h
  • kern/kclock.c

inc/memlayout.h描述了必须通过修改 pmap.c 来实现的虚拟地址的布局

memlayout.hpmap.h 定义了PageInfo,用于跟踪哪些物理内存页面是free的

kclock.ckclock.h 操纵PC的电池供电时钟和CMOS RAM硬件,其内部的BIOS记录PC包含的物理内存大小等信息

pmap.c 需要读取设备硬件以计算物理内存大小,但这部分已经完成了:你不需要知道CMOS硬件的工作细节。

请特别注意 memlayout.hpmap.h,因为本实验要求您使用并理解它们包含的许多定义。 您可能也想查看 inc / mmu.h,因为它还包含许多对本实验有用的定义。

MIT6.828 | Lab 2: Memory Management - Part 1: Physical Page Management
操作系统必须跟踪物理RAM的哪些部分是空闲的以及哪些是当前正在使用的。 JOS使用 page granularity 管理PC的物理内存以使用MMU映射和保护每个分配的内存。\nPart1 目的是编写物理页面分配器,它通过 struct PageInfo 对象的链接列表跟踪哪些页面是空闲的(与xv6不同,它们没有嵌入到自由页面中),每个对应一个物理页面。 在编写剩余的虚拟内存实现之前,您需要编写物理页分配器,因为页表管理代码需要分配用于存储页表的物理内存。
MIT6.828 | Lab 2: Memory Management - Part 2: Virtual Memory
虚拟地址、线性地址和物理地址\n在x86术语中,虚拟地址由 段选择器 segment selector 和段内的偏移量 offset 组成。 线性地址是您在分段翻译 segment translation 之后, 页面翻译 page translation 之前获得的。 物理地址是在段和页面翻译之后最终得到的,最终在硬件总线上抵达RAM的内容。
MIT6.828 | Lab 2: Memory Management - Part 3: Kernel Address Space
JOS将处理器的32位线性地址空间分为两部分。 我们将在实验3中开始加载和运行的用户环境(进程)将控制下部的布局和内容,而内核始终保持对上部的完全控制。 划分线某种程度上由inc/memlayout.h中的符号ULIM定义,为内核保留大约256MB的虚拟地址空间。

参考链接:https://xinqiu.me/2016/12/09/MIT-6.828-2/

updatedupdated2021-03-052021-03-05