На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 4 / Загрузка программы Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Загрузка программы

Все программы загружает общая служба BIOS. Подпрограмма функции AH=4Bh int 21h устанавливает операционную среду, распределяет память для загрузки программы, загружает программу с диска и создает PSP. Для загрузки программы она использует наибольший блок памяти. Файлы типа .EXE указывают свою потребность в памяти в заголовке программы, и подпрограмма загрузки устанавливает соответствующий размер блока памяти. Размер файла типа .COM определяется его минимальной потребностью в памяти, но подпрограмма загрузки не настраивает размер блока для файлов типа .COM. Файл типа .COM начнет выполняться во всем блоке памяти, распределенным для него.


Обычно DOS начинает загрузку программы, потому что пользователь указал ее имя после приглашения, введенного оболочкой. Загружаемая при этом программа называется порождаемой, а программа, выдающая запрос на загрузку, называется порождающей. Порождающая программа создает блок параметров, содержащий адрес таблицы среды, адрес командной строки и адреса двух блоков управления файлами (FCB - file control block). Порождающая программа передает адрес этого блока параметров и адрес спецификации файла в коде ASCIIZ в подпрограмму выполнения загрузки, используя запрос на выполнение функции AX=4B00h прерывания int 21h. Порождающая программа может указать явно размещение операционной среды или может выдать запрос на копирование своей операционной среды путем указания нуля в качестве начального сегмента среды. Если порождающая программа не имеет среды, но при этом выдает запрос, чтобы копировалась ее среда, то порожденная программа не будет иметь операционной среды.


В предыдущем разделе обсуждались подробности загрузки программ. Этот процесс важен, но не настолько интересен, как реализация TSR. После загрузки образа программы с диска, DOS создает сегмент префикса программы. Содержимое этого PSP является важным для TSR. Та же самая программа, которая обслуживает запрос создания PSP (int 21h AH=26h), создает PSP для подпрограммы загрузки.


Перед вызовом подпрограммы создания PSP, подпрограмма загрузки устанавливает флаг, который заставляет подпрограмму создания PSP инициализировать JFT порожденного процесса. Подпрограмма создания PSP рассматривает каждый вход в JFT порождающего процесса, находит соответствующий ему вход SFT, и клонирует ссылку до тех пор, пока в SFT не будет установлен бит "не наследовать", или если вход не будет соответствовать сетевому FCB. Клонирование увеличивает счетчик ссылки SFT и копирует SFN в JFT порожденного процесса. Обычно говорят, что порожденный процесс "наследует" эти файлы. Файл COMMAND.COM использует наследственность для обеспечения переназначения устройств стандартного ввода stdin и стандартного вывода stdout. Так как прикладная программа наследует эти файлы, то она не должна выполнять их явное открытие. Входы JFT для этих описателей уже содержат допустимые номера системных файлов, скопированных из порождающего процесса. Второй побочный эффект установки флага состоит в том, что PSP порожденного процесса становится текущим PSP. Подпрограмма создания PSP:


- заполняет несколько других полей PSP;


- копирует в PSP порожденного процесса содержимое текущих входов IVT для прерываний по завершению (int 22h), break (int 23h) и критической ошибки (int 24h);


- возвращает управление в подпрограмму загрузки.


Подпрограмма загрузки:


- заполняет адреса среды, инициализирует два входа FCB PSP;


- копирует адрес возврата управления порождающего процесса для вектора завершения (int 22h);


- устанавливает адрес передачи с диска в PSP порожденного процесса 80h;


- инициализирует регистры ES, DS, SS и SP и передает управление в порожденный процесс.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz