核心和用户页表分配与回收位于 src\mm\PageManager.cpp
中的AllocMemory(unsigned long size)
和FreeMemory(unsigned long size, unsigned long startAddress)
两个函数发生。模仿现有空闲表方法,需要准备位示图替换原有空闲表。位示图初始化可以方在两个继承类的Initialize()
函数中。
-
在
src\include\MapNode.h
中新增BitMap
类。记录对应页表区的起始地址和负责多少页框 -
在
src\include\Allocator.h
中新增BitMapAllocator
类,并在src\mm\Allocator.cpp
中实现基于位示图管理的页框分配与回收 -
在
src\include\PageManager.h
中新增 public 变量bitmap
,核心态和用户态分别使用一个独立的页表。页表具体参数由子类初始化时设置 -
在
Kernel.cpp
PageManager.cpp
文件中做对应调整
写完了前两个步骤(把 base 改为物理页框号,修改 MapToPageTable()
逻辑),主要修改三个部分,修改 NewProc 部分使得创建子进程时,子进程复制父进程的相对表,在函数中完成物理页框号的赋值;修改 EstablishUserPageTable()
、MapToPageTable
赋值逻辑
第三步栈扩展时,主要修改了SStack()
函数的逻辑,不再需要复制内存。同时,为了防止连续新的栈段的页表在EstablishUserPageTable()
被连续映射,手动进行内存总占用空间核验。新增StableExpand()
函数,模仿Expand()
函数实现,但是通过调用EstablishSStackUserPageTable()
函数实现新增栈空间的地址映射。
TODO: 第四步,堆扩展