|
|
|
|
Программа СТРАТЕГИЙ
Следующий раздел драйвера устройства - это программа СТРАТЕГИЙ. В листинге 6-1 она занимает только три строки выполняемых
кодов. Единственное назначение программы СТРАТЕГИЙ заключается в
сохранении адреса блока запроса для последующего его использования программой ПРЕРЫВАНИЙ.
Что представляет собой блок запроса? Листинг 6-2 представляет
структуру заголовка запроса. С него начинается любой блок запроса
ввода/вывода к драйверу. Для блока запроса может иногда требоваться больше информации, чем содержится в в заголовке запроса,
поэтому заголовок содержит поле длины информации. К заголовку
запроса мы еще вернемся, а сейчас продолжим обсуждение программы
СТРАТЕГИЙ.
Листинг 6-2. Структура заголовка запроса
-----------------------------------------------------------------
request equ ds:[bx] ; базовый адрес заголовка
reqhdr struc ; запроса.
length db ? ; длина блока запроса (байт).
unit db ? ; количество устройств.
command db ? ; код команды для драйвера.
status dw ? ; возвращаемое состояние.
db 8 dup (?) ; резерв.
reqhdr ends
-----------------------------------------------------------------
|
Причина того, что программа СТРАТЕГИЙ обязана сохранять адрес заголовка запроса заключается в том, что MS-DOS выполняет не
единственное обращение к драйверу для выполнения определенной команды. На самом деле, система сначала делает предварительное обращение к драйверу
для того, чтобы информировать драйвер о том,
что он должен сделать и затем делает повторное обращение для выполнения требуемых действий.
Такое двухэтапное обращение к драйверу имеет смысл при работе в MS-DOS какой-либо многозадачной системы. В этом случае запросы
к драйверу от разных задач могут выдаваться в любой момент времени. Путем выделения в драйвере самостоятельных частей анализа
запроса и выполнения запроса драйвер может принимать множество запросов, одновременно удовлетворяя полученный ранее запрос.
MS-DOS передает программе СТРАТЕГИЙ адрес блока запроса в регистрах ES:BX. Хотя программа СТРАТЕГИЙ должна сохранять сам блок
запроса, большинство драйверов ограничивается сохранением его адреса. Это возможно из-за того, что MS-DOS в настоящее время вызывает программу
ПРЕРЫВАНИЙ непосредственно после возврата управления от программы СТРАТЕГИЙ, не изменяя информации в блоке
запроса. Следующий пример демонстрирует фрагмент кода, который сохраняет блок запроса, используя описанную методику :
mov cs:word ptr [req_ptr],bx
mov cs:word ptr [req_ptr + 2],es
|
Однако, как только MS-DOS станет многозадачной, сохранение
только указателя на блок запроса будет уже недопустимо. В этом
случае программа СТРАТЕГИЙ должна будет не только сохранять сам
блок запроса но и, возможно, помещать блоки запросов в очередь
(если, конечно, эту функцию не возьмет на себя MS-DOS). Впрочем,
до тех пока этого не случилось, мы можем пользоваться более простым способом сохранения адреса блока.
Как программа ПРЕРЫВАНИЙ так и программа СТРАТЕГИЙ должны быть
определены в драйвере как FAR процедуры, возвращая управление
MS-DOS, соответственно, командой RETF. В связи с тем, что MS-DOS
вызывает эти подпрограммы с помощью команды CALL типа FAR, любая
иная команда возврата приведет либо к передаче управления по неверному адресу (RETN) либо к порче стека (IRET).
|
|