"String.h" "MM.H" : #Include #Include #Include #Include
"String.h" "MM.H" : #Include #Include #Include #Include
/*
* PAGING based Memory Management
* Virtual memory module mm/mm-vm.c
*/
#include "string.h"
#include "mm.h"
#include <stdlib.h>
#include <stdio.h>
if (rg_node != NULL)
rg_elmt.rg_next = rg_node;
return 0;
}
if(mm->mmap == NULL)
return NULL;
int vmait = 0;
pvma = pvma->vm_next;
}
return pvma;
}
return &mm->symrgtbl[rgid];
}
*alloc_addr = old_sbrk;
return 0;
}
/*__free - remove a region memory
*@caller: caller
*@vmaid: ID vm area to alloc memory region
*@rgid: memory region ID (used to identify variable in symbole table)
*@size: allocated size
*
*/
int __free(struct pcb_t *caller, int vmaid, int rgid) {
struct mm_struct *mm = caller->mm;
if (!PAGING_PAGE_PRESENT(pte)) {
/* Page is not online, make it actively living */
int vicpgn, swpfpn, tgtfpn;
//uint32_t vicpte;
tgtfpn = PAGING_SWP(pte); // The target frame storing our
variable
/* Find victim page */
find_victim_page(caller->mm, &vicpgn);
*fpn = PAGING_FPN(pte);
return 0;
}
MEMPHY_read(caller->mram,phyaddr, data);
return 0;
}
MEMPHY_write(caller->mram,phyaddr, value);
return 0;
}
return 0;
}
return val;
}
return 0;
}
if (!PAGING_PAGE_PRESENT(pte))
{
fpn = PAGING_FPN(pte);
MEMPHY_put_freefp(caller->mram, fpn);
} else {
fpn = PAGING_SWP(pte);
MEMPHY_put_freefp(caller->active_mswp, fpn);
}
}
return 0;
}
newrg->rg_start = cur_vma->sbrk;
newrg->rg_end = newrg->rg_start + size;
return newrg;
}
/*validate_overlap_vm_area
*@caller: caller
*@vmaid: ID vm area to alloc memory region
*@vmastart: vma end
*@vmaend: vma end
*
*/
int validate_overlap_vm_area(struct pcb_t *caller, int vmaid, int
vmastart, int vmaend)
{
struct vm_area_struct *vma = caller->mm->mmap;
/* TODO validate the planned memory area is not overlapped */
while (vma) {
if (vma->vm_id != vmaid) {
/* If the new region overlaps with an existing one, return
error */
if (vmaend > vma->vm_start && vmastart < vma->vm_end) {
return -1;
}
}
vma = vma->vm_next;
}
// No overlapping regions found
return 0;
}
return 0;
if (rgit == NULL)
return -1;
/*Cloning */
if (nextrg != NULL)
{
rgit->rg_start = nextrg->rg_start;
rgit->rg_end = nextrg->rg_end;
rgit->rg_next = nextrg->rg_next;
free(nextrg);
}
else
{ /*End of free list */
rgit->rg_start = rgit->rg_end; //dummy, size 0 region
rgit->rg_next = NULL;
}
}
}
else
{
rgit = rgit->rg_next; // Traverse next rg
}
}
return 0;
}
//#endif
Code of mm-vm.c