Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 mem.h #defineroundew(x) ( (3 + (WORD)(x)) & (~3) ) #definetruncew(x) ( ((WORD)(x)) & (~3) ) #define getstk(n)getmem(n) #define freestk(b,s)freemem(b,s)

Similar presentations


Presentation on theme: "1 mem.h #defineroundew(x) ( (3 + (WORD)(x)) & (~3) ) #definetruncew(x) ( ((WORD)(x)) & (~3) ) #define getstk(n)getmem(n) #define freestk(b,s)freemem(b,s)"— Presentation transcript:

1 1 mem.h #defineroundew(x) ( (3 + (WORD)(x)) & (~3) ) #definetruncew(x) ( ((WORD)(x)) & (~3) ) #define getstk(n)getmem(n) #define freestk(b,s)freemem(b,s) typedef structmblock{ structmblock*mnext; wordmlen; } MBLOCK; #defineendendaddr/* avoid C library conflict*/ externMBLOCK memlist;/* head of free memory list*/ externchar*maxaddr;/* max memory address*/ externchar*end;/* address beyond loaded memory*/ #define MMAX65024/* maximum memory size*/ #defineMBLK512/* block size for global alloc*/ #defineMMIN8192/* minimum Xinu allocation*/ #define MDOS1024/* save something for MS-DOS*/ externchar*getmem(); externintfreemem();

2 2 Memory allocation char *getmem(word nbytes) { int ps; struct mblock *p, *q, *leftover; disable(ps); if ( nbytes == 0 ) { restore (ps); return ( NULL ); } nbytes = roundew (nbytes); for ( q=&memlist, p = q->mnext; (char *) p != NULL; q = p, p = p->mnext ) if ( p->mlen == nbytes ) { q->mnext = p->mnext; restore (ps); return ( (char *) p ); } else if ( p->mlen > nbytes ) { leftover = (struct mblock *) ( (char *) p + nbytes ); q->mnext = leftover; leftover->mnext = p->mnext; leftover->mlen = p->mlen – nbytes; restore (ps); return ( (char *) p ); } restore (ps); return( NULL ); } memlist mlen mnext mlen NULL List of free memory blocks mnext

3 3 Memory release SYSCALL freemem (char *block, word size) { int ps; struct mblock *p, *q; char *top; size = roundew (size); block = (char *) truncew ( (word) block ); if ( size == 0 || block > maxaddr || maxaddr – block < size || block < end ) return (SYSERR); disable (ps); ( char *) q = NULL; for ( p = memlist.mnext; (char*) p != NULL && (char*) p mnext ) ; if ( (char*)q != NULL && (top = (char*)q + q->mlen > block || (char*)p != NULL && (block + size) > (char*)p ) { restore (pd); return (SYSERR); } if ( (char*)q != NULL && top == block ) q->mlen += size; else { ( ( stuct mblock *) block ) -> mlen = size; ( ( stuct mblock *) block ) -> mnext = p; q->mnext = (struct mblock*) block; } if ( ( char*) p != NULL && ( (char*) q + q->mlen ) == (char *)p ) { q->mlen += p->mlen; q->mnext = p->mnext; } restore (ps); return (OK); }

4 4 Queue initialization /* newqueue intializes new linked list */ int newqueue ( ) { struct qent *hptr; struct qent *tptr; int hindex, tindex; hptr = &q[hindex = nextqueue++] ; /* nextqueue is global variable */ tptr = &q[tindex = nextqueue ++ ] ; hptr->qnext = tindex; hptr->qprev = EMPTY; hptr->qkey = MININT; tptr->qnext = EMPTY; tptr->qprev = hindex; tptr->qkey = MAXINT; return (hindex); }

5 5 proc.h /* proc.h – isbadpid */ /* process state constants */ #define PRCURR \01 /* running */ #define PRFREE \02 /* process slot is free */ #define PRREADY \03 #define PRRECV \04 /* waiting for msg */ #define PRSLEEP \05 #define PRSUSP \06 /* suspended */ #define PRWAIT \07 /* waiting in sem que */ #define isbadpid(x) (x =NPROC) struct pentry { char pstate; int pprio; int psem; /* sem where proc waits */ int pmsg; /* msg sent to this process */ char *pregs; /* saved regs (SP) */ char *pbase; /* base of the run-time stack */ word plen; /* stack length */ char pname[PNMLEN+1]; /* proc name */ int pargs; /* number of arguments */ int (*paddr) ( ); /* code address */ } extern struct pentry proctab [ ] ; extern int numproc; /* no of currently active proc*/ extern int nextproc; /* next free slot */ extern int currpid; /* pid of running proc */


Download ppt "1 mem.h #defineroundew(x) ( (3 + (WORD)(x)) & (~3) ) #definetruncew(x) ( ((WORD)(x)) & (~3) ) #define getstk(n)getmem(n) #define freestk(b,s)freemem(b,s)"

Similar presentations


Ads by Google