дел, управляемый MS-DOS, организуется в различные области, вклю-
чая нерезидентную область программ или TPA (transient program
area). Мы также увидели, как TPA управляется посредством использо-
вания блоков управления памятью, и что каждый процесс включает
два блока памяти: блока среды и блока, который мы будем называть
"блок процесса". Теперь мы можем перейти к обзору блока процесса
и рассмотреть отдельные компоненты, которые включает в себя про-
цесс MS-DOS.
Контекст процесса MS-DOS
Рис.2-3 в главе 2 дает нам представление о внутренней струк-
туре процесса MS-DOS для процессов типа .EXE и .COM. Теперь мы
можем объединить это с тем, что уже изучили, для представления в
памяти более детального образа процесса MS-DOS. Это новое предс-
тавление показано на Рис. 3-6.
На Рис.3-6 имеется много деталей, которые нам необходимо
рассмотреть. Мы начнем с сегмента программного префикса или PSP
(program segment prefix).
Сегмент программного префикса
Сегмент программного префикса (PSP), введенный в главе 2, яв-
ляется в некотором смысле "краеугольным камнем" процесса MS-DOS.
- 3-14 -
Адрес сегмента PSP обеспечивает идентификатор процесса и служит в
качестве идентификатора блока памяти процесса. Устанавливаемый
всегда в начале блока процесса PSP также служит в качестве "хра-
нилища" для большого количества ценной информации.
В данном документе PSP представлен в трех представлениях: как
графическое изображение на Рис.3-7; как подробное описание в таб-
лице 3-1 и, наконец, как описание структуры макроассемблера MASM
STRUC в PSP.INC, приведенной в листинге 3-1. Рисунок дает возмож-
ность быстрого размещения информации, таблица обеспечивает глуби-
ну информации, а листинг показывает смещения, необходимые при ис-
пользовании в программах пользователя.
Даже беглый взгляд на Рис.3-7 и таблицу 3-1 открывает обилие
информации, которая может быть полезна программисту. Однако, не-
которые элементы PSP требуют гораздо большего пояснения.
Процесс .COM Нижние адреса памяти Процесс .EXE
|\/\/\/\/\/\/\/\/\/| |\/\/\/\/\/\/\/\/\/|
|COMMAND или преды-| Предыдущий блок |COMMAND или преды-|
| дущей программы | | дущей программы |
------------------ ------------------
.------------------. .------------------.
|| 4D/PSP/size/ || MCB среды || 4D/PSP/size/ ||
||----------------|| ||----------------||
|| имя = строка || блок среды || имя = строка ||
------------------ ------------------
.------------------. .------------------.
|| 5A/PSP/size/ || MCB процесса || 4D/PSP/size/ ||
||----------------|| ||----------------||
|| PSP программы || блок процесса || PSP программы ||
|| - - - - - - - -|| || - - - - - - - -||
|| Код программы || || Код программы ||
|| и данные || || - - - - - - - -||
|| - - - - - - - -|| || Стек или данные||
|| || ------------------
|| || .------------------.
||"Ни себе, ни лю-|| свободный MCB | 5A/0000/size/ |
|| дям" || |------------------|
|| || | |
|| - - - - - - - -|| | |
|| Стек || | Доступна для |
||----------------|| | использования |
|| Недоступна для || Неиспользуемая память | |
|| использования || | |
|/\/\/\/\/\/\/\/\/\| |/\/\/\/\/\/\/\/\/\|
Верхние адреса памяти
-------
|| || - Память, распределяемая/владеющая процессом
-------
Рис.3-6. Контекст процесса MS-DOS в памяти
Адреса завершения PSP
Таблица 3-1 показывает три "адреса завершения", хранимые в
байтах от 0Ah до 15h PSP. Как уже объяснялось выше, эти копии:
- 3-15 -
адреса завершения программы, адреса выхода по нажатию клавиш
Control-Break и адреса выхода по критической ошибке выбираются из
действительных векторов прерываний, размещаемых в int 22h,int 23h
и int 24h. Чтобы воздействовать на поведение системы во время си-
туации завершения (такой как, например, выход по внутреннему пре-
рыванию CONTROL-BREAK/CONTROL-C) программисту требуется изменить
основные векторы прерываний. Это можно сделать, используя для по-
лучения и изменения этих адресов функции "Установить вектор" (Set
Vector - код 25h) и "Получить вектор" (Get Vector - код 35h).
Таблица описателей файлов PSP
С обработкой файлов в сегменте программного префикса связаны
три "недокументируемых" элемента: адрес таблицы описателей, указа-
тель описателей и счетчик описателей. Как увидим потом, эти эле-
менты являются относительными.
Адрес таблицы описателей содержит указатель длины на таблицу,
шириной в несколько байт в памяти, размер которой задается счетчи-
ком описателей. Каждый байтовый элемент этой таблицы является ин-
дикатором описателей, которая может быть открыта для файла или
устройства.
Таблица 3-1
Содержимое сегмента программного префикса
________________________________________________________________
Шестнадцатиричные|
-----------------| Содержимое
смещение| размер |
________|________|______________________________________________
00 | 2 | Прерывание int 20h. Содержит инструкцию пре-
| | рывания int 20h (байты CD 20 - шестнадцати-
| | ричные значения). Устаревшее использование.
| | Программист вместо завершения должен исполь-
| | зовать функцию 4Ch, прерывание int 21h.
________|________|______________________________________________
02 | 2 | Вершина памяти. Содержит адрес сегмента, сле-
| | дующего за памятью программы. Это может быть
| | адрес старой памяти DOS (такой как А000) или
| | адрес следующего доступного блока управления
| | памятью.
________|________|______________________________________________
04 | 1 | Зарезервирован.
________|________|______________________________________________
05 | 5 | Длинный вызов диспетчера функций MS-DOS. Со-
| | держит длинный переход к диспетчеру функций
| | MS-DOS для использования с программами типа
| | CP/M. Устаревшее использование. Программы
| | должны вместо вызова MS-DOS использовать пре-
| | рывание int 21h.
________|________|______________________________________________
06 | 2 | Доступная память. Часть смещения длинного вы-
| | зова также содержит количество байтов, дос-
| | тупных в кодовом сегменте программы.
________|________|______________________________________________
0A | 4 | Адрес завершения программы. Копия адреса пре-
| | рывания int 22h (IP,CS), по которому переда-
- 3-16 -
________________________________________________________________
Шестнадцатиричные|
-----------------| Содержимое
смещение| размер |
________|________|______________________________________________
| | ется управление, когда вводятся Control-Break
| | или Control-C.
________|________|______________________________________________
0E | 4 | Адрес выхода Control-Break. Копия адреса пре-
| | рывания int 23h (IP,CS), по которому переда-
| | ется управление, когда вводятся Control-Break
| | или Control-C.
12 | 4 | Адрес выхода по критической ошибке. Копия ад-
| | реса прерывания int 24h (IP,CS), по которому
| | передается управление, когда во время обра-
| | ботки обнаруживается критическая ошибка.
________|________|______________________________________________
16 | 2 | Префикс программного сегмента владельца. Это
| | сегментный адрес сегмента программного префи-
| | кса владельца. Для процессов, не имеющих вла-
| | дельца, это адрес текущего PSP.
________|________|______________________________________________
18 | 14 | Таблица описателей файла. Содержит 20 одиноч-
| | ных байтов "обработки" (индикаторов) в табли-
| | це файлов системы. Первыми 5 из них являются:
| | STDIN, STDOUT, STDERR, AUXIO и LSTOUT. Смотри
| | текст для более подробного объяснения.
________|________|______________________________________________
2C | 2 | Адрес среды. Адрес сегмента блока среды про-
| | цесса.
________|________|______________________________________________
2E | 4 | Память переключателя стека. Используется для
| | хранения стекового сегмента процесса и указа-
| | теля (SS:SP), когда процесс выполняет опера-
| | ции в стеке MS-DOS.
________|________|______________________________________________
32 | 2 | Счетчик описателей. Максимальное количество
| | элементов, допускаемое в таблице описателей
| | файла. По умолчанию принимается значение 20.
________|________|______________________________________________
34 | 4 | Адрес таблицы описателей.Длинный указатель на
| | таблицу описателей файла.По умолчанию в теку-
| | щем PSP принимается значение смещения 18 (ше-
| | стнадцатиричное значение).
_______|_______________________________________________________
38 | 18 | Зарезервировано.
________|________|______________________________________________