Керування пам’ятю. Вивчення розподілу пам'яті в операційній системі MS DOS, страница 2

          Всі  MSB ув'язані  в ланцюжок. Одержавши за допомогою функції DOS 0x52 сегментну адресу початку ланцюжка  MSB   csegm, пересуваємося по ланцюжку. Перехід до наступного блоку відбувається додаванням до адреси поточного   MSB його поля   size i ще 1.   Перебір закінчується при здобутку   MSB зі значенням   'z'  в полі  type.

     Для кожного   MSB виводиться на екран :

  - сегментна адреса   MSB;

  - програмний   ідентифікатор " власника " блоку пам'яті;

  - розмір блоку пам'яті в параграфах;

  - клас блоку ;

  - символьний   ідентифікатор власника ( тільки   DOS  4. 0 i вище );

  - рядок виклику власника ( DOS  3. 0 i вище ).

   Сегмента адреса, Pid власника i розмiр блоку одержуються з  MSB. Клас блоку визначається по наступним правилам. Якщо Pid власника блоку   нульовий, блок є  вільним ( клас Free ). Для зайнятих блоків клас уточнюється. Якщо   Pid (сегментна адреса Psp ) власника містить адресу, що лежить до кінця пам'яті, що розподіляється

memtop ( звичайно це число 8 ), то блок одержує клас   DOS.

  Для   DOS  4. 0 i вище визначаємо символьний   ідентіфикатор власника, для цього "заглядаємо " в   MSB того блоку, на що вказує поле owner поточного блоку, i виводимо його пле  pgmname.

   Тільки   DOS  4. 0 дозволяє одержати   iдентiфікатор   командного процесору   DOS  описаним вище. В   Psp власника зі зсувом 0x16 знаходиться  сегментна  адреса " батька " - програми, яка запустила дану програму. Для програм, запущених з командного рядка DOS , батьком є  Command.сom. Батьком   Command.сom є  вiн сам. По цьому признаку ( сам собі батько ) він i може бути  ідентифікований.

Частина тексту  програми, яка була змінена для індивідуального завдання:

. . . . . . . . . .

void addr_PSP (void);

unsigned int pid__;

…………...

void main()

{ ss=0;

  addr_PSP();

  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);

  do {

    cmcb=(struct MCB *)MK_FP(csegm,0);

    textattr(14);

    cprintf("Addr=%04X:0000  ",csegm);

    textattr(12);

    cprintf("PID=%04X  ",cmcb->owner);

    if (pid__==cmcb->owner)

    {

    ss+=(cmcb->size*16);

    }

……………..

cprintf("Size=%-6u ",ss);

  getch();

  clrscr();

}

void addr_PSP (void)

{

  rr.h.ah=0x62;

  intdos(&rr,&rr);

  pid__=rr.x.bx;

}   

Результати виконання програми.

Лабораторная работа N13

Управление памятью

Карта распределяемой памяти.

Addr=0211:0000      PID=0008    Size=35088   Dos

Addr=0AA3:0000    PID=0008    Size=64         Dos

Addr=0AA8:0000    PID=0C6C   Size=16         Data  COMMAND.COM

Addr=0AAA:0000   PID=0C6C   Size=208       Env   COMMAND.COM

Addr=0AB8:0000    PID=0000    Size=0           Free

Addr=0AB9:0000    PID=0ABA  Size=6928     Pgm   KEYB

Addr=0C6B:0000    PID=0C6C   Size=3536     Pgm   COMMAND.COM

Addr=0D49:0000    PID=0D4D   Size=32         Data   vmm32

Addr=0D4C:0000    PID=0D4D  Size=2864     Pgm    vmm32

Addr=0E00:0000    PID=0E11   Size=240       Env    LAB13   D:\...\LAB13.EXE

Addr=0E10:0000    PID=0E11   Size=17408   Pgm   LAB13   D:\...\LAB13.EXE

Addr=1251:0000     PID=0000     Size=56032   Free

Нажмите любую клавишу для возврата в DOS.Size=17648

Висновки: Я отримав карту розподілу пам’яті і побачив, що з початку ідуть значення MCB=M, що означає,  що блок не є останнім.Після отримання значення MCB=Z (блок є останнім) ми повернулися у DOS.

  В ході лабораторної роботи я отримав потрібні відповіді й виконав індивідуальне завдання; закріпив навички роботи з С++ та отримав практичні навички роботи з блоками MCB.