试验目标

为此ucore需要在已有的分段机制的基础上,进一步加入分页机制,达到可以通过分页完成对不同应用程序执行的内存空间进行隔离(其实分段也能够达到此目的,但相对实现的开销会比较大,受到的限制(比如支持的应用执行个数)也较多)的目标。并且为后续的虚存管理提供基础支持。

proj5/5.1/5.1.1/5.1.2/5.2概述

  • 基于分页机制的存储管理;
  • 32位地址空间的二级页表结构;

proj5.1在proj5的基础上实现了基于best fit内存分配算法的页级内存分配和释放功能;proj5.1.1在proj5.1的基础上实现了first fit内存分配算法的页级内存分配和释放功能;proj5.1.2在proj5.1的基础上实现了worst fit内存分配算法的页级内存分配和释放功能;proj5.2在proj5.1的基础上实现了更加实用和强大的buddy内存分配算法的页级内存分配和释放功能。这些proj是操作系统原理相关算法的具体实现。读者可以参考这些实现完成新的内存分配算法。在这里通过讲解proj5的实现,让读者理解如何基于一个内存分配管理框架来实现不同的内存分配算法。

  • boot/bootasm.S:增加了对计算机系统中物理内存布局的探测功能;
  • kern/init/entry.S:根据临时段表重新暂时建立好新的段空间,为进行分页做好准备。
  • kern/mm/pmm.[ch]:pmm.h定义物理内存管理类框架struct pmm_manager,基于此通用框架可以实现不同的物理内存管理策略和算法(default_pmm.[ch] 实现了一个基于此框架的简单物理内存管理策略); pmm.c包含了对此物理内存管理类框架的访问,以及与建立、修改、访问页表相关的各种函数实现。
  • kern/sync/sync.h:为确保内存管理修改相关数据时不被中断打断,提供两个功能,一个是保存eflag寄存器中的中断屏蔽位信息并屏蔽中断的功能,另一个是根据保存的中断屏蔽位信息来使能中断的功能;
  • libs/list.h:定义了通用双向链表结构以及相关的查找、插入等基本操作,这是建立基于链表方法的物理内存管理(以及其他内核功能)的基础。其他有类似双向链表需求的内核功能模块可直接使用list.h中定义的函数。
  • libs/atomic.h:定义了对一个变量进行读写的原子操作,确保相关操作不被中断打断。

编译并运行proj5的命令如下:

通过上图,我们可以看到ucore在显示其entry(入口地址)、etext(代码段截止处地址)、edata(数据段截止处地址)、和end(ucore截止处地址)的值后,探测出计算机系统中的物理内存的布局(e820map下的显示内容)。接下来ucore会以页为最小分配单位实现一个简单的内存分配管理,完成二级页表的建立,进入分页模式,执行各种我们设置的检查,最后显示ucore建立好的二级页表内容,并在分页模式下响应时钟中断。下面我们将分析到底发生了什么事情。