Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Различные авторы Весь текст 2311.07 Kb

Программирование и кодирование

Предыдущая страница Следующая страница
1 ... 77 78 79 80 81 82 83  84 85 86 87 88 89 90 ... 198
         тва,  как устройства системного времени. Так как драйвер устройс-
         тва "Часы" практически всегда обеспечивается системой,  необходи-
         мость использования этого бита возникает довольно редко.
            Драйвер устройства "Часы" обычно  является  обычным  драйвером
         символьного  устройства  без  каких-либо дополнительных атрибутов
         (слово атрибутов 8008H).  Время считывается командой INPUT (ввод)
         и  устанавливается командой OUTPUT (вывод).  По любой из этих ко-
         манд всегда передается ровно 6 байт, имеющих следующее значение :

                # БАЙТА         РАЗМЕР        ЗНАЧЕНИЕ

                0, 1            16 бит        Количество дней с 1.1.1980г.
                2               8 бит         Минуты
                3               8 бит         Часы
                4               8 бит         Сотые доли секунды
                5               8 бит         Секунды

         БИТ2: NUL.  Бит NUL означает, что данный драйвер является драйве-
         ром устройства NUL. В связи с тем,  что NUL-драйвер не может быть
         заменен,  нет  никакой необходимости создавать драйвер устройства
         NUL.

         БИТЫ1и0: STDIN и STDOUT. Биты STDIN и STDOUT означают, что данный
         драйвер является соответственно драйвером стандартного устройства
         ввода и вывода. Для устройства CON, обслуживающего системную кла-
         виатуру и монитор, эти биты почти всегда определяются вместе. Ес-
         ли устанавливается новый драйвер консоли (такой как ANSI.SYS) для
         того,  чтобы добавить какие-либо новые возможности,  то оба  этих
         бита  должны  быть установленными.  Атрибуты STDIN и STDOUT могут
         быть установлены только на одном драйвере из всех активных  (дру-
         гие копии CON-драйвера тоже могут иметь эти атрибуты,  однако ак-
         тивным будет только последний установленный CON-драйвер).

                Вектора точек входа программ СТРАТЕГИЙ и ПРЕРЫВАНИЙ

            Следующие два слова заголовка драйвера содержат смещения прог-
         рамм  СТРАТЕГИЙ и ПРЕРЫВАНИЙ,  соответственно.  MS-DOS использует
         эту информацию совместно с сегментным адресом драйвера для  опре-
         деления точек входа в указанные программы. Сегментный адрес драй-
         вера система, конечно же, узнает при его загрузке.


                                      - 6-23 -
                          Поле имени/количества устройств

            Последние восемь байт заголовка драйвера  служат  двум  целям.
         Для  символьных драйверов это поле содержит ASCII имя устройства,
         дополненных справа пробелами. Например, для драйвера принтера это
         поле может содержать строку 'PRN '.
            Для блоковых устройств имеет значение только первый  байт.  Он
         показывает MS-DOS сколько отдельных устройств поддерживается дан-
         ным драйвером.  Такая возможность необходима потому,  что  многие
         контроллеры  поддерживают более одного физического дисковода. Так
         как остальные семь байт поля в этом случае не  используются,  там
         можно хранить имя устройства для поиска драйвера в памяти или для
         идентификации драйвера. Например, поле количества устройств драй-
         вера RAM-диска,  называемого RDISK (см. листинг 6-10), может быть
         определено как :

                UNIT_FIELD      DB       1, 'RDISK   '

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

            Следующий раздел  драйвера устройства  - это программа СТРАТЕ-
         ГИЙ.  В листинге 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 какой-либо многозадачной системы.  В этом случае запросы
         к драйверу от разных задач могут выдаваться в любой момент време-
         ни.  Путем  выделения  в  драйвере самостоятельных частей анализа

                                      - 6-24 -
         запроса и выполнения запроса драйвер  может  принимать  множество
         запросов, одновременно удовлетворяя полученный ранее запрос.
            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).

                               Программа ПРЕРЫВАНИЙ

            После того,  как  программа  СТРАТЕГИЙ  сохраняет указатель на
         блок запроса и возвращает управление,  MS-DOS вызывает  программу
         ПРЕРЫВАНИЙ  (называемую также точкой входа запроса в документации
         фирмы IBM по PC DOS). Собственно запрос к драйверу обрабатывается
         именно этой программой.
            Самое первое действие, которое должна выполнить программа ПРЕ-
         РЫВАНИЙ - это сохранить все регистры. На момент обращения к драй-
         веру устройства стек имеет емкость примерно в 20 слов. Сохранение
         всех регистров,  включая флаги,  требует 14 слов.  Если программе
         ПРЕРЫВАНИЙ требуется для работы более чем 6 слов стека, она долж-
         на установить свой собственный локальный стек.
            После сохранения текущего состояния процессора, программа ПРЕ-
         РЫВАНИЙ  должна  получить  блок  запроса,  сохраненный программой
         СТРАТЕГИЙ.  Если адрес этого блока был сохранен с помощью  приве-
         денных выше команд,  то получить адрес блока параметров можно ко-
         мандой LDS

               lds        bx,cs:[req_ptr]  ; получить адрес блока запроса

            Теперь, получив доступ к заголовку блока запроса,  можно начи-
         нать его обработку.  Первый шаг заключается  в  анализе  запроса.
         Доступ  к  нужным полям блока запроса будет значительно облегчен,
         если описана структура заголовка. Структура, которую мы использу-
         ем  в драйвере RDISK и которая определяет формат заголовка запро-
         са, показана в листинге 6-2.
            Если драйвер должен обслуживать блоковое устройство, то первый
         элемент заголовка запроса, который должен быть проверен, это поле

                                      - 6-25 -
         количества устройств (request.unit).  После проверки корректности
         поля request.unit,  программа ПРЕРЫВАНИЙ должна получить из блока
         запроса код команды (request.command),  которую требуется  выпол-
         нить.  Символьные драйверы могут обращаться сразу к коду команды,
         т.к.  каждый символьный драйвер поддерживает только одно устройс-
         тво.
            Определив код команды,  программа ПРЕРЫВАНИЙ  должна  передать
         управление соответствующему обработчику. В листинге 6-3, содержа-
         щем пример программы ПРЕРЫВАНИЙ, показан один из способов переда-
         чи управления требуемому обработчику, основанный на использовании
         таблицы переходов.  Таблица переходов представляет собой последо-
         вательность  смещений программ-обработчиков команд.  Для передачи
         управления определенному обработчику  необходимо  указать  индекс
         требуемой подпрограммы,  заданной своим смещением в таблице пере-
         ходов. Этот индекс (в нашем случае это код команды) преобразуется
         в  смещение  в  таблице,  после  чего выполняется косвенный вызов
         подпрограммы или переход на нее через таблицу переходов

                call       word ptr cs:jumptab[bx]  ; обработать команду

            В связи с тем,  что индекс (т.е. код команды) может быть боль-
         ше, чем максимальный из используемых кодов команд, программа ПРЕ-
         РЫВАНИЙ должна выполнять проверку индекса для  того,  чтобы  убе-
         диться в его правильности.  При этом,  вместо сравнения индекса с
         каким-либо заранее фиксированным значением,  программа ПРЕРЫВАНИЙ
         сравнивает код команды с максимально допустимым значением, храня-
         щимся в поле max_cmd :

                cmp        bl,[max_cmd]             ; команда допустима ?

            Для того, чтобы понять пользу хранения максимально допустимого
         значения  в  памяти,  взгляните  на  таблицу 6-2.  В этой таблице
         представлены команды,  поддерживаемые различными версиями MS-DOS.
         Максимальный  код  команды,  обеспечиваемый MS-DOS версий до 3.0,
         имеет значение 0CH. Однако, учитывая тот факт, что max_cmd распо-
         лагается  в памяти,  драйвер может модифицировать это значение во
         время инициализации,  позволяя, таким образом, использовать новые
Предыдущая страница Следующая страница
1 ... 77 78 79 80 81 82 83  84 85 86 87 88 89 90 ... 198
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама