Lab 2 物理内存管理

1 实验目的

  • 理解基于段页式内存地址的转换机制
  • 页表的建立和使用
  • 物理内存的管理方法

2 实验内容

三个部分:

  • 发现系统中的物理内存
  • 建立对物理内存的初步管理:了解连续内存管理
  • 建立页表实现虚拟内存到物理内存之间的映射,了解段页式内存管理机制

2.1 练习

  • 分析 ucore提供的答案,说明自己的实现与参考答案区别
  • 列出本实验中重要的知识点
    • 对应的 OS 原理
  • 未出现但很重要的知识点

练习0:填写已有实验

  • 本实验依赖于实验一
  • 需要将实验一的代码填入lab2相应位置

练习1:实现first-fit 连续物理内存分配算法

3 物理内存管理

3.1 实验执行流程概述

  • 总控函数:kern_init
    • 调用完成物理内存初始化的pmm_init函数之前和之后的区别:
      • 首先,bootloader工作有所增加,在bootloader中完成了对内存资源的探测工作,使得 ucore kernel 在后续执行中能够基于其探测出的物理内存情况进行物理内存管理初始化工作
      • 其次,bootloader 不像lab1,直接调用kern_init,而是先调用kern_entry函数(/lab2/kern/init/entry.S)完成以下工作后,再调用kern_init
        • kern_entry 主要任务:为了执行kern_init建立良好的C语言运行环境(设置堆栈),并且临时建立一个段映射关系,为之后建立分页机制的过程做准备
  • kern_init 在完成一些输出并对lab1实验结果检查后,进入物理内存管理初始化工作
    • 即调用pmm_init函数完成对物理内存的管理的初始化(lab 2)
    • 接着,执行中断 和 异常相关的初始化工作(即调用pic_init和idt_init),这些工作与lab 1中断异常初始化工作内容一样
  • 物理内存管理:
    • 首先,探测可用的物理内存空间资源;了解物理内存位于何处、大小
      • 便可用固定页面大小来划分整个物理内存空间,并准备以此为最小内存分配单元来管理整个物理内存,管理在内核运行过程中每页内存(状态:free、used、reserved)
    • 接着,ucore kernel 建立页表,启动分页机制,使得 CPU 中的 MMU 把预先建立好的页表中的页表项读入TLB,根据页表项描述的 虚拟页(Page)与物理页帧(Page Frame)的对应关系完成CPU对内存的读写和执行操作。