13.07.2015 Views

iAPX 286 Operating System Writers Guide 1983

iAPX 286 Operating System Writers Guide 1983

iAPX 286 Operating System Writers Guide 1983

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

REAL MEMORY MANAGEMENTPL/M-<strong>286</strong> COMPILER 9613-5131 date PAGE 51*******************************************************//* Place a segment into the available space list. */98 199 211313 21131 21132 21133 21134 21135 21136 21137 21138 2H19 2111 2112 2113 2114 2116 2117 2118 2119 21213 2121 2122 2123 2124 2125 2126 2127 2128 3129 31313 3RETURN_SPACE: PROCEDURE (FREE_SEG) REENTRANT;DECLARE FREE SEGSELECTOR,FREE-LINK BASED FREE SEG STRUCTURE (MEM_LINK);DECLARE CURR LINK BASED SLOT A STRUCTURE (MEM_LINK) ,NEIBR ADDR DWORD,NEIBR-LINK BASED SLOT B STRUCTURE (MEM_LINK) ,FREE BASEDWORD,FREE-SIZEDWORD,HI SIZEDWORD,NCASEBYTE,HI USED LITERALLY '131H' ,LO-USED LITERALLY '132H' ;CALL GET$SEGMENT$BASE (FREE SEG, @FREE BASE);FREE BASE = FREE BASE - PARAGRAPH; /* point to tags */FREE-SIZE = GET$SEGMENT$LIMIT (FREE SEG);FREE-SIZE = FREE SIZE + 1; -CALL-ROUND SIZE (@FREE SIZE);/* Determine which case. */NCASE = 0;/* Check higher neighbor. */NEIBR ADDR = FREE BASE + FREE SIZE + TAGS SIZE;CALL POINT AT (SLOT B,DWRIGHTS,@NEIBR ADDR,LINK LIMIT);IF NEIBR LINK.LO TAG = USED THEN NCASE=NCASE OR-HI_USED;ELSE HI-SIZE = NEIBR LINK. SIZE; /* Save *//* Check-lower neighbor. */NEIBR ADDR = FREE BASE;CALL POINT AT(SLOT B,DWRIGHTS,@NEIBR ADDR,LINK LIMIT);IF NEIBR_LINK.HI_TAG=USED THEN NCASE~NCASE OR LO_USED;/* Which segment should become the new current one? */IF (NCASE AND LO USED)13THEN CURR AVLBL-= FREE BASE; /* low neighbor used */ELSE CURR-AVLBL = NEIBR LINK.START; /* low free */CALL POINT:::AT (SLOT_A, DWRIGHTS,@CURR_AVLBL, LINK_LIMIT) ;/* Calculate size of new segment. */IF (NCASE AND LO USED) = LO USED /* if low neibr used */THEN CURR LINK.SIZE = 13; - .ELSE /* already contains size of low neighbor */CURR LINK. SIZE = CURR LINK. SIZE + TAGS_SIZE;IF (NCASE AND HI USED) HI USED/* if high neighbor free *7THEN CURR LINK. SIZE = CURR LINK.SIZE+HI SIZE+TAGS_SIZE;CURR_LINK.SIZE = CURR_LINK.SIZE + FREE_SIZE;/* Set next .and prior links in new segment. */IF NCASE = 3 /* neither neighbor free */THEN DO; /* insert at head of available list */CURR LINK. PRIOR = NULL PHYS ADDR;CURR:::LINK.NEXT FIRST=AVLBL;END;Figure 3-9. Code for Memory-Management Example (Cont'd.)3-19 121960-001

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!