前言
现在有一个需求,为0x40000这个线性地址分配一个物理页,你应该如何来实现呢?在看实际代码之前,我尝试自己编写代码来模拟这个分页过程,其实很简单,核心思路就是建立索引表。源码放在最后,代码很LOW,省去了各种属性与权限检查,主要理解页目录表机制的建立。
代码解读
首先,准备好三个物理页,依次为PDE页表,PTE页表,以及我们要使用的物理页。
PULONG32 PdPage = (PULONG32)malloc(PAGESIZE_4K); // PDE 页表项
PULONG32 PtPage = (PULONG32)malloc(PAGESIZE_4K); // PTE 页表项
PUCHAR PhysicalPage = (PUCHAR)malloc(PAGESIZE_4K); // 准备的物理页
之后来编写线性地址的解析代码,我们现在要使用10-10-12分页模式,按照这种格式进行解析,代码如下。
void GetOffset(ULONG32 address, int* offset_1, int* offset_2, int* offset_3) {
*offset_1 = (address >> 22);
*offset_2 = ((address >> 12) & (~(0xffff << 10)));
*offset_3 = (address & (~(0xffff << 12)));
}
现在将线性地址与三个物理页输入进去,对此来进行内存分配,此时我们的模拟页表就建立好了,现在尝试完善读写操作。
voi