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.