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


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


Абревиатура PSP представляется весьма удачной, так как она созвучна со словом "паспорт". PSP - тот блок, из которого можно почерпнуть всю доступную информацию о загруженной в память программе, и во всех операциях DOS по управлению программами, данными и памятью программа представляется прежде всего адресом (сегментным) своего PSP. Этот адрес в системе часто именуется PID (Program Identifier - Программный Идентификатор). Где-то в DOS имеется ячейка памяти, в которой система хранит PID активной в текущий момент программы. Выше говорилось, что функции 0x51, 0x62 позволяют программе получить сегментный адрес своего PSP - это не совсем так. Обе эти функции возвращают PID активной программы. Поскольку MS DOS - система по своему назначению однопрограммная, понятия "свой" и "активный", как правило, идентичны, но для резидентных программ они могут и не совпадать (см. главу 14). Хранящийся в системе PID активной программы можно изменить при помощи функции DOS 0x50 (новый PID задатся в BX).

Программа примера 11.2 выполняет поиск адреса или адресов, по которым DOS хранит PID активной в текущий момент программы. Обращением к функции 0x52 программа получает сегментный адрес конца области памяти, занимаемой DOS (объяснение этой операции отложим до главы 13). Далее программа получает свой PID (функция 0x62) и последовательным перебором адресов от начала сегмента 0x60 и до конца памяти DOS ищет в памяти слово, совпадающее с полученным PID. Если такое слово отыскалось, то программа должна убедиться, что совпадение не случайно. Для этого она с помощью функции 0x50 устанавливает новый PID (на 1 больший прежнего), вновь считывает слово по тому же адресу и обязательно (!) восстанавливает прежний PID. Если при изменении при помощи функции 0x50 активного PID соответственно изменилось и содержимое памяти по найденному адресу, то найденный адрес запоминается в массивах mseg, moff, и поиск продолжается. Продолжение поиска обусловлено предположением о том, что DOS, возможно, хранит PID активной программы не в одном месте (по источникам, в версиях DOS 2.x таких мест было два), однако, хотя в нашей программе и зарезервированы 10-элементные массивы, мы в наших экспериментах в DOS 3.30 и 5.0 всегда получали единственный адрес.

При поиске мы изменяли PID при помощи функции DOS, а читали его прямым обращением к памяти. Контрольные операции - изменение PID прямой записью в память и чтение его функцией DOS всегда подтверждают правильность поиска.




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