📄 util.c
字号:
/*
* util.c
* Copyright (c) Inst. of Machine Intelligence at Nankai University
*/
#include "util.h"
#include "mmu.h"
#include <stdlib.h>
void check_pgdir()
{
extern char memory[];
extern phyaddr_t cpu_cr3;
pde_t* pgdir = (pde_t*)(cpu_cr3 + memory);
pte_t* pgtable = NULL;
int i = 0;
int j = 0;
//////////....for循环检测虚拟地址0xe0000000之后256M地址对应的页表,只读
for (i = 0; i < 64; i++) //只需64项顶级页表项和64项二级页表项
{
assert((pgdir[PDX(0xe0000000) + i] & (PTE_P | PTE_W)) == PTE_P); //验证顶级页表项是存在且只读的
pgtable = (pte_t*)(PTE_ADDR(pgdir[PDX(0xe0000000) + i]) + memory);
for (j = 0; j < 1024; j++)
{
assert((pgtable[j] & (PTE_P | PTE_W)) == PTE_P); //验证每个二级页表中的每个页表项是存在且只读的
}
}
for (i = 0; i < 64; i++)
{
assert((pgdir[PDX(0xf0000000) + i] & (PTE_P | PTE_W)) == (PTE_P | PTE_W)); //验证顶级页表项是存在且可写的
pgtable = (pte_t*)(PTE_ADDR(pgdir[PDX(0xf0000000) + i]) + memory);
for (j = 0; j < 1024; j++)
{
assert((pgtable[j] & (PTE_P | PTE_W)) == (PTE_P | PTE_W)); //验证每个二级页表中的每个页表项是存在且可写的
}
}
printf("Checking Page Table Succeeded\n"); //若验证成功,则输出提示信息“检测成功!”
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -