From 1be2b1fcdf51a22386163955d3eb4fb7c737bee3 Mon Sep 17 00:00:00 2001 From: KAAAsS Date: Sun, 23 May 2021 20:25:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E4=BF=AE=E6=AD=A3=E9=A1=B5?= =?UTF-8?q?=E8=A1=A8=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab5/kernel/mm/page_table.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lab5/kernel/mm/page_table.c b/lab5/kernel/mm/page_table.c index b3376c9..a2d258d 100644 --- a/lab5/kernel/mm/page_table.c +++ b/lab5/kernel/mm/page_table.c @@ -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(); // @@ -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;