再次修正页表 bug
This commit is contained in:
parent
0c7b007570
commit
1be2b1fcdf
@ -217,9 +217,9 @@ int map_range_in_pgtbl(vaddr_t * pgtbl, vaddr_t va, paddr_t pa,
|
||||
va_end++; // 有不完整的一页
|
||||
}
|
||||
for (va_cur = va_start; va_cur < va_end; va_cur += PAGE_SIZE) {
|
||||
// 创建一页
|
||||
// 搜寻前 N 页
|
||||
cur_ptp = (ptp_t *) pgtbl;
|
||||
for (cur_level = 0; cur_level < 4; cur_level++) {
|
||||
for (cur_level = 0; cur_level < 3; cur_level++) {
|
||||
page_type = get_next_ptp(cur_ptp, cur_level, va_cur, &next_ptp, &entry, true);
|
||||
if (page_type < 0) {
|
||||
// 无法映射
|
||||
@ -232,9 +232,19 @@ int map_range_in_pgtbl(vaddr_t * pgtbl, vaddr_t va, paddr_t pa,
|
||||
cur_ptp = next_ptp;
|
||||
}
|
||||
}
|
||||
// 配置页
|
||||
set_pte_flags(entry, flags, USER_PTE);
|
||||
entry->l3_page.pfn = cur_pfn++;
|
||||
// 三级页检查占用
|
||||
page_type = get_next_ptp(cur_ptp, 3, va_cur, &next_ptp, &entry, false);
|
||||
if (page_type == -ENOMAPPING) {
|
||||
// 配置页
|
||||
entry = &(cur_ptp->ent[GET_L3_INDEX(va_cur)]);
|
||||
entry->pte = 0;
|
||||
entry->l3_page.is_valid = 1;
|
||||
entry->l3_page.is_page = 1;
|
||||
entry->l3_page.pfn = cur_pfn++;
|
||||
set_pte_flags(entry, flags, USER_PTE);
|
||||
} else {
|
||||
BUG("Page already mapped");
|
||||
}
|
||||
}
|
||||
flush_tlb();
|
||||
// </lab2>
|
||||
@ -272,7 +282,7 @@ int unmap_range_in_pgtbl(vaddr_t * pgtbl, vaddr_t va, size_t len)
|
||||
// 创建一页
|
||||
cur_ptp = (ptp_t *) pgtbl;
|
||||
for (cur_level = 0; cur_level < 4; cur_level++) {
|
||||
page_type = get_next_ptp(cur_ptp, cur_level, va, &next_ptp, &entry, false);
|
||||
page_type = get_next_ptp(cur_ptp, cur_level, va_cur, &next_ptp, &entry, false);
|
||||
if (page_type < 0) {
|
||||
// 无法映射
|
||||
break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user