/* Displays the contents of page directory. Starting
* virtual address represented by the page directory
* entry is shown followed by the physical page
* address of the page table
*/
void DisplayPageDirectory()
{
int i;
int ctr = 0;
printf("Page directory for the process, pid=%x\n", GetCurrentProcessId());
for (i = 0; i<1024; i++) {
if (PageDirectory[i] & 0x01) {
if ((ctr % 3) == 0) {
printf("\n");
}
printf("%08x:%08x ", i << 22, PageDirectory[i] & 0xFFFFF000);
ctr++;
}
}
printf("\n");
}
DisplayPageDirectory() 函数在用户模式下运行并打印出由 CfuncGetPageDirectory() 初始化的 PageDirectory 数组。函数检查每一个表项的最低位(Least Significant Bit,LSB)。仅当最低位置位时页表项才有效。对于无效表项函数跳过不打印。 函数每行打印3个页表项,换句话说,每三个表项后打印一个换行字符。对每个目录项都打印其逻辑地址,所打印的相应的页表地址则是从页目录中取得的。如前所述,逻辑地址的前10位(或者说最高10位)用作页目录的索引。换句话说,索引值为 i 的页表项代表着前10位为 i 的逻辑地址。对于每一个目录项,函
数打印逻辑地址范围的基址。这个基地址(即范围中最低的地址)的低22位(或叫 22 LSBs)为 0。此基地址是由索引值 i 左移至前10位得到的。对应于逻辑地址的页表的地址保存在页目录项的前20位(或叫 20 MSBs)中。12 LSBs 为页目录项的标志。函数通过掩闭标志位来计算页表地址。
main()
{
WORD CallGateSelector;
int rc;
static short farcall[3];
/* Assembly stub that is called through callgate */
extern void GetPageDirectory(void);
/* Creates a callgate to read the page directory
* from Ring 3 */