Системное программное обеспечение персональных ЭВМ


Пример 2 - часть 2


Программа получает при помощи функции DOS 0x52 сегментный адрес начала цепочки MCB csegm и движется по цепочке. Переход к следующему блоку производится прибавлением к адресу текущего MCB его поля size и еще 1. Перебор заканчивается при достижении MCB со значением 'Z' в поле type.

Для каждого MCB выводится на экран:

  • сегментный адрес MCB;
  • программный иденитфикатор "владельца" блока памяти;
  • размер блока памяти в параграфах;
  • класс блока (см.ниже);
  • символьный идентификатор владельца (только DOS 4.0 и дальше);
  • строка вызова владельца (DOS 3.0 и выше).

Сегментный адрес, PID владельца и размер блока получаются из MCB очевидным образом.

Класс блока определяется по следующим правилам. Если PID владельца блока нулевой, блок является свободным (класс Free). Для занятых блоков класс уточняется. Если PID (сегментный адрес PSP) владельца содержит адрес, лежащий до вершины распределяемой памяти memtop (обычно это число 8), то блок получает класс Dos. Для блоков, не принадлежащих DOS, прежде всего проверяется сегментный адрес владельца. Если этот адрес является адресом сегмента, следующего за текущим MCB, это означает, что блок памяти содержит программный сегмент и получает класс Pgm. В противном случае программа "заглядывает" в PSP владельца. Со смещением 0x2C в PSP содержится адрес сегмента окружения; если этот адрес является адресом сегмента, следующего за текущим MCB, то блок получает класс Env. Если класс блока не удается определить ни одним из вышеописанных способов, считаем, что блок содержит данные и помечаем его классом Data.

Для DOS 4.0 и выше определяем символьный идентификатор владельца, для этого "заглядываем" в MCB того блока, на который указывает поле owner текущего блока, и выводим его поле pgmname. Это единственный способ получить идентификаторы резидентных программ, загружаемых в память командой INSTALL DOS 4.0 и выше.

Только DOS 4.0 позволяют получить идентификатор командного процессора DOS вышеописанным образом. Однако, в ранних версиях DOS можно опознать блок памяти, принадлежащий командному процессору вот каким способом.


- Начало -  - Назад -  - Вперед -