vmap_page_range
user_0531932
c_cpp
3 years ago
1.6 kB
15
Indexable
/*
* vmap_page_range - map a range of page at aligned address
*/
int vmap_page_range(struct pcb_t *caller, // process call
int addr, // start address which is aligned to pagesz
int pgnum, // num of mapping page
struct framephy_struct *frames, // list of the mapped frames
struct vm_rg_struct *ret_rg) // return mapped region, the real mapped fp
{ // no guarantee all given pages are mapped
// uint32_t * pte = malloc(sizeof(uint32_t));
// int fpn;
int pgit = 0;
int pgn = PAGING_PGN(addr);
ret_rg->rg_end = ret_rg->rg_start = addr; // at least the very first space is usable
struct framephy_struct* traverse = frames;
struct mm_struct *mm = caller->mm;
//printf("Traverse fpn: %d\n", traverse->fpn);
while(traverse!= NULL)
{
//printf("Traverse fpn: %d\n", traverse->fpn);
/* TODO map range of frame to address space
* [addr to addr + pgnum*PAGING_PAGESZ
* in page table caller->mm->pgd[]
*/
uint32_t pte;
pte_set_fpn(&pte, traverse->fpn);
//printf("traverse->fpn: %d\n", traverse->fpn);
mm->pgd[pgn + pgit] = pte;
/* Tracking for later page replacement activities (if needed)
* Enqueue new usage page */
enlist_pgn_node(&caller->mm->fifo_pgn, pgn + pgit);
/* Update return region */
ret_rg->rg_end += PAGING_PAGESZ;
pgit++;
traverse=traverse->fp_next;
}
return 0;
}Editor is loading...