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










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

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

Программа СТРАТЕГИЙ

Следующий раздел драйвера устройства - это программа СТРАТЕГИЙ. В листинге 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).


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

Hosted by uCoz