Example #1
0
static void check_swap(void)
{
	//backup mem env
	int ret, count = 0, total = 0, i;
	list_entry_t *le = &free_list;
	while ((le = list_next(le)) != &free_list)
	{
		struct Page *p = le2page(le, page_link);
		assert(PageProperty(p));
		count++, total += p->property;
	}
	assert(total == nr_free_pages());
	cprintf("BEGIN check_swap: count %d, total %d\n", count, total);

	//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;

	pde_t *pgdir = mm->pgdir = boot_pgdir;
	assert(pgdir[0] == 0);

	struct vma_struct *vma = vma_create(BEING_CHECK_VALID_VADDR,
			CHECK_VALID_VADDR, VM_WRITE | VM_READ);
	assert(vma != NULL);

	insert_vma_struct(mm, vma);

	//setup the temp Page Table vaddr 0~4MB
	cprintf("setup Page Table for vaddr 0X1000, so alloc a page\n");
	pte_t *temp_ptep = NULL;
	temp_ptep = get_pte(mm->pgdir, BEING_CHECK_VALID_VADDR, 1);
	assert(temp_ptep!= NULL);
	cprintf("setup Page Table vaddr 0~4MB OVER!\n");

	for (i = 0; i < CHECK_VALID_PHY_PAGE_NUM; i++)
	{
		check_rp[i] = alloc_page();
		assert(check_rp[i] != NULL);
		assert(!PageProperty(check_rp[i]));
	}
	list_entry_t free_list_store = free_list;
	list_init(&free_list);
	assert(list_empty(&free_list));

	//assert(alloc_page() == NULL);

	unsigned int nr_free_store = nr_free;
	nr_free = 0;
	for (i = 0; i < CHECK_VALID_PHY_PAGE_NUM; i++)
	{
		free_pages(check_rp[i], 1);
	}
	assert(nr_free==CHECK_VALID_PHY_PAGE_NUM);

	cprintf("set up init env for check_swap begin!\n");
	//setup initial vir_page<->phy_page environment for page relpacement algorithm

	pgfault_num = 0;

	check_content_set();
	assert(nr_free == 0);
	for (i = 0; i < MAX_SEQ_NO; i++)
		swap_out_seq_no[i] = swap_in_seq_no[i] = -1;

	for (i = 0; i < CHECK_VALID_PHY_PAGE_NUM; i++)
	{
		check_ptep[i] = 0;
		check_ptep[i] = get_pte(pgdir, (i + 1) * 0x1000, 0);
		//cprintf("i %d, check_ptep addr %x, value %x\n", i, check_ptep[i], *check_ptep[i]);
		assert(check_ptep[i] != NULL);
		assert(pte2page(*check_ptep[i]) == check_rp[i]);
		assert((*check_ptep[i] & PTE_P));
	}
	cprintf("set up init env for check_swap over!\n");
	// now access the virt pages to test  page relpacement algorithm
	ret = check_content_access();
	assert(ret == 0);

	//restore kernel mem env
	for (i = 0; i < CHECK_VALID_PHY_PAGE_NUM; i++)
	{
		free_pages(check_rp[i], 1);
	}

	//free_page(pte2page(*temp_ptep));
	free_page(pde2page(pgdir[0]));
	pgdir[0] = 0;
	mm->pgdir = NULL;
	mm_destroy(mm);
	check_mm_struct = NULL;

	nr_free = nr_free_store;
	free_list = free_list_store;

	le = &free_list;
	while ((le = list_next(le)) != &free_list)
	{
		struct Page *p = le2page(le, page_link);
		count--, total -= p->property;
	}
	cprintf("count is %d, total is %d\n", count, total);
	//assert(count == 0);

	cprintf("check_swap() succeeded!\n");
}
Example #2
0
// LAB2: below code is used to check the first fit allocation algorithm (your EXERCISE 1) 
// NOTICE: You SHOULD NOT CHANGE basic_check, default_check functions!
static void
default_check(void) {
    int count = 0, total = 0;
    list_entry_t *le = &free_list;
    while ((le = list_next(le)) != &free_list) {
        struct Page *p = le2page(le, page_link);
        assert(PageProperty(p));
        count ++, total += p->property;
    }
    assert(total == nr_free_pages());

    basic_check();

    struct Page *p0 = alloc_pages(5), *p1, *p2;
    assert(p0 != NULL);
    assert(!PageProperty(p0));

    list_entry_t free_list_store = free_list;
    list_init(&free_list);
    assert(list_empty(&free_list));
    assert(alloc_page() == NULL);

    unsigned int nr_free_store = nr_free;
    nr_free = 0;

    free_pages(p0 + 2, 3);
    assert(alloc_pages(4) == NULL);
    assert(PageProperty(p0 + 2) && p0[2].property == 3);
    assert((p1 = alloc_pages(3)) != NULL);
    assert(alloc_page() == NULL);
    assert(p0 + 2 == p1);

    p2 = p0 + 1;
    free_page(p0);
    free_pages(p1, 3);
    assert(PageProperty(p0) && p0->property == 1);
    assert(PageProperty(p1) && p1->property == 3);

    assert((p0 = alloc_page()) == p2 - 1);
    free_page(p0);
    assert((p0 = alloc_pages(2)) == p2 + 1);

    free_pages(p0, 2);
    free_page(p2);

    assert((p0 = alloc_pages(5)) != NULL);
    assert(alloc_page() == NULL);

    assert(nr_free == 0);
    nr_free = nr_free_store;

    free_list = free_list_store;
    free_pages(p0, 5);

    le = &free_list;
    while ((le = list_next(le)) != &free_list) {
        struct Page *p = le2page(le, page_link);
        count --, total -= p->property;
    }
    assert(count == 0);
    assert(total == 0);
}
Example #3
0
// LAB2: below code is used to check the first fit allocation algorithm (your EXERCISE 1) 
// NOTICE: You SHOULD NOT CHANGE basic_check, default_check functions!
static void
default_check(void) {
	// 好吧,我们现在来看一下默认的测试吧!
    int count = 0, total = 0;
    list_entry_t *le = &free_list; // free_list应该是一个文件头吧!
    while ((le = list_next(le)) != &free_list) { // 开始遍历
        struct Page *p = le2page(le, page_link);
        assert(PageProperty(p));
        count ++, total += p->property; // counter表示一个有多少个page,total表示一共有多少个空闲页
    }
    assert(total == nr_free_pages());

    basic_check();

    struct Page *p0 = alloc_pages(5), *p1, *p2; // 分配5个页面给p0
    assert(p0 != NULL);
    assert(!PageProperty(p0));

    list_entry_t free_list_store = free_list;
    list_init(&free_list);
    assert(list_empty(&free_list));
    assert(alloc_page() == NULL); // 然后分配一个页面应该为空,确实应该为空

    unsigned int nr_free_store = nr_free;  // 空闲的页面的数目
    nr_free = 0; // 然后将他们全部变为0

    free_pages(p0 + 2, 3); // 这个玩意能free吗?
    assert(alloc_pages(4) == NULL); // 因为nr_free=3
    assert(PageProperty(p0 + 2) && p0[2].property == 3);
    assert((p1 = alloc_pages(3)) != NULL); // 给p1分配3块,现在nr_free=0
    assert(alloc_page() == NULL);
    assert(p0 + 2 == p1); 

    p2 = p0 + 1;
    free_page(p0); // 好吧,释放一个页面, nr_free=1
    free_pages(p1, 3); // 现在nr_free = 4
    assert(PageProperty(p0) && p0->property == 1);
    assert(PageProperty(p1) && p1->property == 3);
	/**   p0    p2    p1				end
	 *     |     |     |     |     |     |       
	 *     -------------------------------
 	 *     |  N           N     N     N  |
	 *	   |                             |
	 *     -------------------------------
	 */
    assert((p0 = alloc_page()) == p2 - 1); // 这里出错了。我倒是要看一看啦!这里应该不会出错啊,参照上面的图,重新分配的话,会分配p0,恰好是p2-1
    free_page(p0);
    assert((p0 = alloc_pages(2)) == p2 + 1); // 这里是测试first fit的
	/** start  p2    p0     		   end
	*     |     |     |     |     |     |
	*     -------------------------------
	*     |  N                       N  |
	*	  |                             |
	*     -------------------------------
	*/

    free_pages(p0, 2);
    free_page(p2);
	/** start  p2    p0     		   end
	*     |     |     |     |     |     |
	*     -------------------------------
	*     |  N     N     N     N     N  |
	*	  |                             |
	*     -------------------------------
	*/

    assert((p0 = alloc_pages(5)) != NULL);
    assert(alloc_page() == NULL);

    assert(nr_free == 0);
    nr_free = nr_free_store; // 恢复原来的样子

    free_list = free_list_store;
    free_pages(p0, 5);

    le = &free_list;
    while ((le = list_next(le)) != &free_list) { // 又要开始遍历了,这里主要是测试经过这么折腾之后,没有出现页丢失的情况
        struct Page *p = le2page(le, page_link);
        count --, total -= p->property;
    }
    assert(count == 0);
    assert(total == 0);
}