为什么我不需要在更改分页结构后在QEMU上使用invlpg?

时间:2015-11-20 22:25:51

标签: c kernel paging mmu tlb

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

(我启用了分页,前4MB是身份映射,我的内核映射到PDE#768以获得更高的半模式。)

...
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!");
...

以上代码导致ISR 14(页面错误)被触发。我的理解是,在改变分页结构之后,需要通过调用invlpg来更新TLB。它是否正确?为什么在没有调用invlpg的情况下QEMU仍然会发生页面错误?是不是因为QEMU的TLB模仿了一种与真实硬件不同的怪异方式?任何见解都会很棒。

0 个答案:

没有答案