From 5a6bea53225ecdd5873263b6c19b10e7ae72b201 Mon Sep 17 00:00:00 2001 From: KAAAsS Date: Tue, 19 Apr 2022 21:10:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E9=A1=B5=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab2/kernel/mm/page_table.c | 22 ++++++++++++++++------ lab3/kernel/mm/page_table.c | 22 ++++++++++++++++------ lab4/kernel/mm/page_table.c | 22 ++++++++++++++++------ 3 files changed, 48 insertions(+), 18 deletions(-) diff --git a/lab2/kernel/mm/page_table.c b/lab2/kernel/mm/page_table.c index b3376c9..a2d258d 100644 --- a/lab2/kernel/mm/page_table.c +++ b/lab2/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; diff --git a/lab3/kernel/mm/page_table.c b/lab3/kernel/mm/page_table.c index b3376c9..a2d258d 100644 --- a/lab3/kernel/mm/page_table.c +++ b/lab3/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; diff --git a/lab4/kernel/mm/page_table.c b/lab4/kernel/mm/page_table.c index b3376c9..a2d258d 100644 --- a/lab4/kernel/mm/page_table.c +++ b/lab4/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;