Всі 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=1251:0000 PID=0000 Size=56032 Free
Нажмите любую клавишу для возврата в DOS.Size=17648
Висновки: Я отримав карту розподілу пам’яті і побачив, що з початку ідуть значення MCB=M, що означає, що блок не є останнім.Після отримання значення MCB=Z (блок є останнім) ми повернулися у DOS.
В ході лабораторної роботи я отримав потрібні відповіді й виконав індивідуальне завдання; закріпив навички роботи з С++ та отримав практичні навички роботи з блоками MCB.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.