C 为什么不';更改分页结构后,我是否需要在QEMU上使用invlpg?

C 为什么不';更改分页结构后,我是否需要在QEMU上使用invlpg?,c,kernel,paging,mmu,tlb,C,Kernel,Paging,Mmu,Tlb,我从头开始写内核,我很好奇。。。为什么当我更改页面目录中的某些内容时,QEMU会立即识别更改,而无需刷新TLB?这是我的密码: (我启用了分页功能,前4MB是标识映射的,我的内核在PDE#768中映射为上半模式。) 上述代码导致触发ISR 14(页面错误)。据我所知,更改分页结构后,需要通过调用invlpg来更新TLB。这是正确的吗?为什么在QEMU中仍然发生页面错误而不调用invlpg?是因为QEMU的TLB是以一种与真实硬件不同的奇怪方式模拟的还是什么?任何洞察都会很棒。同样的事情发生在Vi

我从头开始写内核,我很好奇。。。为什么当我更改页面目录中的某些内容时,QEMU会立即识别更改,而无需刷新TLB?这是我的密码:

(我启用了分页功能,前4MB是标识映射的,我的内核在PDE#768中映射为上半模式。)


上述代码导致触发ISR 14(页面错误)。据我所知,更改分页结构后,需要通过调用
invlpg
来更新TLB。这是正确的吗?为什么在QEMU中仍然发生页面错误而不调用
invlpg
?是因为QEMU的TLB是以一种与真实硬件不同的奇怪方式模拟的还是什么?任何洞察都会很棒。

同样的事情发生在VirtualBox上。同样的事情发生在VirtualBox上。
...
register_int_handler(14, &page_fault); //Setup my page fault handler
//We are in the higher half so we unmap PDE 0 since we don't need it anymore
uint32_t *pd = (uint32_t *)0xFFFFF000; //Get PD
pd[0] = 0x00000002; //Supervisor, R/W, Not Present

uint32_t *cause_fault = (uint32_t *)0x00001000; //Any old unmapped page here
//Call to invlpg here?
*cause_fault = 5; //Causes the page fault

print("Hello world!");
...