lab3代码中可能的bug
匿名2023/07/31 19:50:53提问
    lab3lab4lab5student
337

1. kern/mm/pmm.c:pgdir_alloc_page函数是在指定的页目录表中分配一个物理页,

2. lab3在这里添加了这样一段代码:

        if (swap_init_ok){
            swap_map_swappable(check_mm_struct, la, page, 0);
            page->pra_vaddr=la;
            assert(page_ref(page) == 1);
        }

3. 在swap_init函数中swap_init_ok会被设置为1

4. 在kern/mm/swap.c:check_swap函数中中:

static void
check_swap(void) {
... //now we set the phy pages env struct mm_struct *mm = mm_create(); assert(mm != NULL);
 extern struct mm_struct *check_mm_struct;
 assert(check_mm_struct == NULL);

 check_mm_struct = mm;// 这里是最后一次给check_mm_struct<br />...<br />     mm_destroy(mm); //这里销毁了mm, 但是没有将check_mm_struct赋值为NULL, 但是mm在内存中还存在, 访问mm也不会出错<br />...

}

5. 在发生page fault的时候, do_page_fault函数会调用pgdir_alloc_page(参见第一条), 但是这时候显然check_mm_struct已经被销毁了, 但是由于kfree的实现, 这段内存还是可以访问的, 也不会出错.

6. 到了lab5之后第5条中的pgdir_alloc_page会崩溃, diff lab3和lab5的swap.c文件发现:

8a9,10
> #include <default_pmm.h>
> #include <kdebug.h>
263c265,267
<
---
> free_page(pde2page(pgdir[0]));
> pgdir[0] = 0;
> mm->pgdir = NULL;
265c269,270
<
---
> check_mm_struct = NULL; // lab5好像发现了没有设为NULL的问题, 在这里填上了一句, 但是没有backport到lab3, lab4
>

7. 这是导致lab5以后pgdir_alloc_page崩溃的原因. 我觉得应该把pgdir_alloc_page添加一个参数, mm_struct, 从而指定使用哪个mm.

回答(1
    推荐问答
      Simple Empty
      暂无数据