/** * Initializes the container data for the root process (the one with index 0). * The root process is the one that gets spawned first by the kernel. */ void container_init(unsigned int mbi_addr) { unsigned int real_quota; // TODO: define your local variables here. int max_nps; int i; pmem_init(mbi_addr); real_quota = 0; max_nps = get_nps(); /** * TODO: compute the available quota and store it into the variable real_quota. * It should be the number of the unallocated pages with the normal permission * in the physical memory allocation table. */ for (i = 0; i < max_nps; i++) { if (at_is_norm(i) == 1 && at_is_allocated(i) == 0) { real_quota += 1; } } KERN_DEBUG("\nreal quota: %d\n\n", real_quota); CONTAINER[0].quota = real_quota; CONTAINER[0].usage = 0; CONTAINER[0].parent = 0; CONTAINER[0].nchildren = 0; CONTAINER[0].used = 1; }
/** * Initializes the container data for the root process (the one with index 0). * The root process is the one that gets spawned first by the kernel. */ void container_init(unsigned int mbi_addr) { unsigned int real_quota; unsigned int nps, i, norm, used; pmem_init(mbi_addr); real_quota = 0; /** * compute the available quota and store it into the variable real_quota. * It should be the number of the unallocated pages with the normal permission * in the physical memory allocation table. */ nps = get_nps(); i = 1; while (i < nps) { norm = at_is_norm(i); used = at_is_allocated(i); if (norm == 1 && used == 0) real_quota++; i++; } KERN_DEBUG("\nreal quota: %d\n\n", real_quota); CONTAINER[0].quota = real_quota; CONTAINER[0].usage = 0; CONTAINER[0].parent = 0; CONTAINER[0].nchildren = 0; CONTAINER[0].used = 1; }
/** * Allocation of a physical page. * * 1. First, implement a naive page allocator that scans the allocation table (AT) * using the functions defined in import.h to find the first unallocated page * with usable permission. * (Q: Do you have to scan allocation table from index 0? Recall how you have * initialized the table in pmem_init.) * Then mark the page as allocated in the allocation table and return the page * index of the page found. In the case when there is no avaiable page found, * return 0. * 2. Optimize the code with the memorization techniques so that you do not have to * scan the allocation table from scratch every time. */ unsigned int palloc() { unsigned int tnps; unsigned int palloc_index; unsigned int palloc_cur_at; unsigned int palloc_is_norm; unsigned int palloc_free_index; tnps = get_nps(); palloc_index = last_palloc_index + 1; palloc_free_index = tnps; while( palloc_index < tnps && palloc_free_index == tnps ) { palloc_is_norm = at_is_norm(palloc_index); if (palloc_is_norm == 1) { palloc_cur_at = at_is_allocated(palloc_index); if (palloc_cur_at == 0) palloc_free_index = palloc_index; } palloc_index ++; } if (palloc_free_index == tnps) palloc_free_index = 0; else { at_set_allocated(palloc_free_index, 1); } last_palloc_index = palloc_free_index % tnps; return palloc_free_index; }
int MATIntro_test1() { int rn10[] = {1,3,5,6,78,3576,32,8,0,100}; int i; int nps = get_nps(); for(i = 0; i< 10; i++) { set_nps(rn10[i]); if (get_nps() != rn10[i]) { set_nps(nps); dprintf("test 1 failed.\n"); return 1; } } set_nps(nps); dprintf("test 1 passed.\n"); return 0; }