litceymos.ru 1


ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Кафедра электронных вычислительных машин


Отчёт

по лабораторной работе № 2

Тема: „Исследование стратегий распределения и

освобождения памяти”

Вариант 2


выполнил

ст. гр. СП-04н

Войтов А.В.


Донецк 2006

Отобразить карту оперативной памяти; удалить блок с заданного адреса с проверкой на принадлежность адреса области основной памяти.

#include

#include

#include

struct mcb

{

unsigned char marker;

unsigned int owner;

unsigned int size;

unsigned char res[3];

unsigned char name[8];

};

struct block

{

char type;

unsigned int addr,owner;


};

block blocks[100];

unsigned int num;

int set_umb(int umb)

{

if (_osmajor<5) return 0;

else

{

asm{

mov ax,5803h

mov bx,umb

int 21h

jc err

}

return 1;

err:return 0;

}

}

void print8(char s[])

{

for(int i=0;(i<=7)&&(s[i]);i++) printf("%c",s[i]);

}

void map()

{

mcb far *ptr;

asm{

mov ax,5200h

int 21h

}

num=0;

unsigned int seg=peek(_ES,_BX-2);

printf(" Address Size Mark Type Owner's Owner's name \n"

"of block (bytes) address (if not free)\n\n");

do

{

ptr=(mcb far *)MK_FP(seg,0);

blocks[num].addr=seg;

blocks[num].owner=ptr->owner-1;

printf("%04X:0 %8lu %c ",seg+1,(long)ptr->size<<4,ptr->marker);


if(!ptr->owner)

{

printf(" F %04X:0 Free block",ptr->owner);

blocks[num].type='F';

}

else

{

if(ptr->owner==8)

{

printf(" S %04X:0 System block",ptr->owner);

blocks[num].type='S';

}

else

if(ptr->owner==seg+1)

{

blocks[num].type='P';

printf(" P %04X:0 ",ptr->owner);

print8(ptr->name);

}

else

if(*(int far*)MK_FP(ptr->owner,0x2C)==seg+1)

{

blocks[num].type='E';

printf(" E %04X:0 ",ptr->owner);

print8(((mcb far *)MK_FP(ptr->owner-1,0))->name);

}

else

{

blocks[num].type='D';

printf(" D %04X:0 ",ptr->owner);

print8(((mcb far *)MK_FP(ptr->owner-1,0))->name);

}

}

printf("\n");

seg=seg+ptr->size+1;

num++;

}

while(ptr->marker!='Z');

}

void main()

{

textmode(C4350);

if(!set_umb(1)) printf("Access to UMB failed.\n");

map();

unsigned int addr;

printf("Input address of block, which needs to be deleted (0 for exit): ");

int i,flag;

do

{

flag=0;

scanf("%x",&addr);

if(!addr) return;

for(i=0;i
if(blocks[i].addr+1==addr)

{

flag=1;

break;

}

if(!flag)

{

gotoxy(1,wherey()-1);

printf("No such block, reenter the address (0 for exit): ");

gotoxy(61,wherey());

}

}

while(!flag);

clrscr();

mcb far *ptr=(mcb far *)MK_FP(addr-1,0);


switch(blocks[i].type)

{

case 'P':

for(int j=0;j
if(blocks[j].owner==blocks[i].addr)

{

mcb far *p=(mcb far *)MK_FP(blocks[j].addr,0);

p->owner=0;

}

break;

case 'E':

int far *p=(int far*)MK_FP(blocks[i].owner,0x2C);

*p=0;

break;

}

ptr->owner=0;

map();

if(addr<0xA000) printf("Block is in conventional memory.\n");

else printf("Block is in UMB.\n");

getch();

textmode(C80);

}

Результаты работы программы:

Address Size Mark Type Owner's Owner's name

of block (bytes) address (if not free)


020D:0 8480 M S 0008:0 System block

0420:0 2896 M P 0420:0 COMMAND

04D6:0 48 M D 06BD:0 dpmiload

04DA:0 16 M D 06BD:0 dpmiload

04DC:0 16 M F 0000:0 Free block

04DE:0 1920 M E 0420:0 COMMAND

0557:0 1712 M D 05C3:0 BC

05C3:0 2256 M P 05C3:0 BC

0651:0 96 M D 06BD:0 dpmiload

0658:0 1184 M D 06BD:0 dpmiload

06A3:0 400 M F 0000:0 Free block

06BD:0 22976 M P 06BD:0 dpmiload

0C5A:0 5360 M D 06BD:0 dpmiload

0DAA:0 640 M D 06BD:0 dpmiload

0DD3:0 5824 M D 06BD:0 dpmiload

0F40:0 508912 M D 05C3:0 BC

8B80:0 1712 M E 8BEC:0 LAB2

8BEC:0 21504 M P 8BEC:0 LAB2

912D:0 60704 M F 0000:0 Free block

A000:0 192512 M S 0008:0 System block

CF01:0 1696 M F 0000:0 Free block

CF6C:0 464 M P CF6C:0 MSCDEXNT

CF8A:0 128 M D D5BA:0 DOSX

CF93:0 1728 M F 0000:0 Free block

D000:0 8192 M S 0008:0 System block

D201:0 12544 M S 0008:0 System block

D512:0 2672 M P D512:0 REDIR


D5BA:0 34720 M P D5BA:0 DOSX

DE35:0 6096 M P DE35:0 KB16

DFB3:0 66768 Z F 0000:0 Free block

Input address of block, which needs to be deleted (0 for exit): 8BEC

Address Size Mark Type Owner's Owner's name

of block (bytes) address (if not free)


020D:0 8480 M S 0008:0 System block

0420:0 2896 M P 0420:0 COMMAND

04D6:0 48 M D 06BD:0 dpmiload

04DA:0 16 M D 06BD:0 dpmiload

04DC:0 16 M F 0000:0 Free block

04DE:0 1920 M E 0420:0 COMMAND

0557:0 1712 M D 05C3:0 BC

05C3:0 2256 M P 05C3:0 BC

0651:0 96 M D 06BD:0 dpmiload

0658:0 1184 M D 06BD:0 dpmiload

06A3:0 400 M F 0000:0 Free block

06BD:0 22976 M P 06BD:0 dpmiload

0C5A:0 5360 M D 06BD:0 dpmiload

0DAA:0 640 M D 06BD:0 dpmiload

0DD3:0 5824 M D 06BD:0 dpmiload

0F40:0 508912 M D 05C3:0 BC

8B80:0 1712 M F 0000:0 Free block

8BEC:0 21504 M F 0000:0 Free block

912D:0 60704 M F 0000:0 Free block

A000:0 192512 M S 0008:0 System block

CF01:0 1696 M F 0000:0 Free block

CF6C:0 464 M P CF6C:0 MSCDEXNT

CF8A:0 128 M D D5BA:0 DOSX

CF93:0 1728 M F 0000:0 Free block

D000:0 8192 M S 0008:0 System block

D201:0 12544 M S 0008:0 System block

D512:0 2672 M P D512:0 REDIR

D5BA:0 34720 M P D5BA:0 DOSX

DE35:0 6096 M P DE35:0 KB16

DFB3:0 66768 Z F 0000:0 Free block

Block is in conventional memory.