Skip to content

Commit c9a16b8

Browse files
committed
fix vmm_get_phys = 0
1 parent 7fc9464 commit c9a16b8

1 file changed

Lines changed: 13 additions & 0 deletions

File tree

src/system/mem/vmm.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,27 @@ uint64_t vmm_get_phys(page_table_t *pml4, uint64_t virt) {
214214

215215
if (!(pdpt[pdpt_idx] & PTE_PRESENT))
216216
return 0;
217+
218+
// Проверяем бит 7 (PS - Page Size) на уровне PDPT (Огромная страница 1 ГБ)
219+
if (pdpt[pdpt_idx] & (1ULL << 7)) {
220+
return (pdpt[pdpt_idx] & ~0x3FFFFFFFULL) + (virt & 0x3FFFFFFFULL);
221+
}
222+
217223
page_table_t *pd = (page_table_t *)VIRT(pdpt[pdpt_idx] & ~0xFFFULL);
218224

219225
if (!(pd[pd_idx] & PTE_PRESENT))
220226
return 0;
227+
228+
// Проверяем бит 7 (PS - Page Size) на уровне PD (Огромная страница 2 МБ)
229+
if (pd[pd_idx] & (1ULL << 7)) {
230+
return (pd[pd_idx] & ~0x1FFFFFULL) + (virt & 0x1FFFFFULL);
231+
}
232+
221233
page_table_t *pt = (page_table_t *)VIRT(pd[pd_idx] & ~0xFFFULL);
222234

223235
if (!(pt[pt_idx] & PTE_PRESENT))
224236
return 0;
237+
225238
return (pt[pt_idx] & ~0xFFFULL) + (virt & 0xFFF);
226239
}
227240

0 commit comments

Comments
 (0)