-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvmmemory.c
54 lines (48 loc) · 1.24 KB
/
vmmemory.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "vmmemory.h"
#include "globals.h"
int dMem[DADDR_SIZE];//extern variable
static Header *memptr = NULL;// the last pointer to used memory
static Header * mem = (Header *)(dMem + 4096);
static const int INTSIZE = sizeof(int);
static const int HADERSIZE = sizeof(Header);
int pMalloc(unsigned n_int_bytes)
{
Header *p, *newp;
int nbytes = n_int_bytes * INTSIZE;
unsigned nunits = ((nbytes + HADERSIZE - 1) / HADERSIZE) + 1;
if (memptr == NULL)
{
memptr->next = memptr = mem;
memptr->usedsize = 1;
memptr->freesize = MEMSIZE - 1;
}
p = memptr;
while (p->next != memptr && (p->freesize < nunits)) { p = p->next;}
if (p->freesize < nunits) return NULL; // no available block
newp = p + p->usedsize;
newp->usedsize = nunits;
newp->freesize = p->freesize - nunits;
newp->next = p->next;
p->next = newp;
p->freesize = 0;
memptr = newp;
return ((newp + 1) - mem) * (HADERSIZE / INTSIZE) + 4096;
}
void pFree(Header *ap)
{
Header *bp, *p, *prev;
bp = ap - 1;
prev = memptr, p = memptr->next;
while ((p != bp) && (p != memptr)){
prev = p;
p = p->next;
}
if (p != bp) return;
prev->freesize += p->usedsize + p->freesize;
prev->next = p->next;
memptr = prev;
}
void clearVmem(){
memset(dMem, 0, sizeof(dMem));
memptr = NULL;
}