Міністерство освіти та науки України
Національний Технічний Університет
«Харківський Політехнічний Інститут»
Звіт
з лабораторної роботи № 2
з дисципліни «СПО»
Виконав: студент
групи КІТ-14б
Губін О.С.
Викладачі:
Максюта Н.В.
Межерицький С.Г.
Харків 2006 р.
Тема: «Керування пам’яттю».
Мета роботи: Вивчення росподілу пам’яті у операційній системі MS-DOS та отримання практичних навичок роботи з блоками керування пам’яттю.
Індивідуальне завдання: Порахувати кількість МСВ-блоків, що займає command.com
Хід виконання роботи:
Текст програми:
#define byte unsigned char
#define word unsigned int
#include <dos.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
void get_DOS_ver_h(void); /* получить номер версии DOS */
void print_head(void); /* вывод заголовка лаб. работы */
word adr_PSP(void);
struct MCB { /* блок упpавления памятью */
char type; /* тип */
word owner,/* владелец */
size; /* размер */
byte reserved[3]; /* зарезервировано */
char pgmname[8]; /* имя программы, находящейся в данном блоке
( для DOS 4.0 и выше ) */
};
struct MCB *cmcb; /* адpес текущего MCB */
struct MCB *emcb; /* адpес MCB сpеды */
word memtop; /* сегм.адрес начала памяти */
word csegm; /* сегментный адpес текущего MCB */
word othersegm; /* сегм.адрес другого MCB */
word fathersegm; /* сегм.адрес родителя */
byte *envstr; /* адpес стpоки окружения */
int envlen; /* длина очередной строки окружения */
int envsize; /* размер блока окружения */
byte dos; /* номер версии DOS */
unsigned long int mysize=0;
byte mycou=0;
word mypsp;
union REGS rr;
struct SREGS sr;
int i,n;
char *s;
void main()
{
int chk=0;
print_head();
n=0; /* Число выведенных на экран блоков */
get_DOS_ver_h();
/* получить адрес системных блоков */
rr.h.ah=0x52;
intdosx(&rr,&rr,&sr);
/* получить адрес начала цепочки */
memtop=csegm=peek(sr.es,rr.x.bx-2);
mypsp=adr_PSP();
printf("DOS: %d, MYPSP %X \n",dos, mypsp);
do {
cmcb=(struct MCB *)MK_FP(csegm,0);
{
textattr(14);
cprintf("Addr=%04X:0000 ",csegm);
textattr(12);
cprintf("PID=%04X ",cmcb->owner);
textattr(11);
cprintf("Size=%-6u ",cmcb->size*16);
n++;/* Счетчик выведенных блоков увеличить на 1 */
if (cmcb->owner==0)
{
textattr(15);
cprintf(" Free"); /* блок свободен */
}
else { /* блок занят */
/* блок принадлежит DOS ? */
if (cmcb->owner<memtop)
{
textattr(12);
cprintf(" Dos ");
}
else { /* блок не принадлежит DOS */
/* если PID хозяина указывает на текущий блок,
то это программный сегмент */
if (csegm==cmcb->owner-1)
{
textattr(10);
cprintf(" Pgm ");
}
else {
/* адpес блока сpеды для хозяина этого блока памя-
ти находится в PSP хозяина со смещением 0x2C */
othersegm=peek(cmcb->owner,0x2c);
/* адpес родителя для программы-хозяина этого бло-
ка находится в PSP хозяина со смещением 0x16 */
fathersegm=peek(cmcb->owner,0x16);
/* если на текущий блок указывает адрес окружения
хозяина, то это блок окружения */
if (csegm==othersegm-1)
{
textattr(11);
cprintf(" Env ");
}
/* иначе - это блок данных */
else
{
textattr(14);
cprintf(" Data ");
}
}
/* если хозяин сам себе родитель, то это COMMAND */
if (cmcb->owner==fathersegm)
{
textattr(12);
cprintf("COMMAND.COM");
mysize+=cmcb->size*16;
mycou++;
}
else { /* для другой программы узнаем ее имя */
textattr(15);
if (dos>3) {
emcb=(struct MCB *)MK_FP(cmcb->owner-1,0);
for (i=0,s=emcb->pgmname; i<8; i++)
{
if (*s>0)
{
if(!strcmp(s,"COMMAND"))mycou++;
printf("%c",*(s++));
}
else
printf(" ");
}
printf(" ");
}
if (dos>2)
{
/* для DOS 3.0 и выше имя - из строки вызова */
emcb=(struct MCB *)MK_FP(othersegm-1,0);
envsize=emcb->size*16; /*размер окружения */
envstr=(char *)MK_FP(othersegm,0);
do
{
/* пропуск строк окружения до пустой строки */
envlen=strlen(envstr)+1;
envstr+=envlen; envsize-=envlen;
}
while ((envlen>1)&&(envsize>0));
envstr+=2;
envsize-=2; /* 2 байта - кол.строк */
/* envstr - указатель на строку вызова */
if (envsize>0)
{
textattr(11);
printf("%s",envstr);
}
}
}
}
printf("\n");
}
}
csegm+=(cmcb->size+1); /* переход к следующему блоку */
if(n==20)
{ /* Весь экран занят информацией о блоках */
textattr(0x0a);
gotoxy(30,24);
cprintf("Нажмите любую клавишу");
chk=getch();
n=0;
print_head();
}
}
while ((cmcb->type!='Z')&&(chk!=27)); /* выход по последн.блоку */
cprintf("Эта программа занимает %lu байт(%u).", mysize, mycou);
textattr(0x0a);
gotoxy(20,24);
cprintf("Нажмите любую клавишу для возврата в DOS.");
textattr(0x07);
getch();
getch();
clrscr();
}
void get_DOS_ver_h(void)
{
rr.h.ah=0x30;
intdos(&rr,&rr);
dos=rr.h.al;
}
void print_head(void)
{
textbackground(0);
clrscr();
textattr(0x0a);
cprintf("---------------");
cprintf(" Лабораторная работа N13 ");
cprintf("---------------");
cprintf("---------------");
cprintf(" Управление памятью ");
cprintf("---------------");
gotoxy(28,3);
textattr(12);
cprintf("Карта распределяемой памяти.\n\r");
}
word adr_PSP(void)
{
rr.h.ah=0x62;
intdos(&rr, &rr);
return rr.x.bx;
}
Результат роботи програми:
--------------- Лабораторная работа N13 --------------
---------------- Управление памятью --------------
- Карта распределяемой памяти.
Эта программа занимает 2 МСВ-блока
Висновок: В ході виконання лабораторної роботи вивчив росподіл пам’яті у операційній системі MS-DOS та отримав практичні навички роботи з блоками керування пам’яттю.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.