Вивчення розподілу пам’яті у операційній системі MS-DOS

Страницы работы

Содержание работы

Міністерство освіти та науки України

Національний Технічний Університет

«Харківський Політехнічний Інститут»

Звіт

з лабораторної роботи № 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 та отримав практичні навички роботи з блоками керування пам’яттю.

Похожие материалы

Информация о работе