Сервисные функции
Набор сервисных функций, доступных драйверу, обычно
представляет собой подмножество стандартной библиотеки того языка высокого
уровня, на котором обычно пишутся драйверы. В большинстве современных
ОС это С. При выборе этого подмножества используется простой критерий:
удаляются или заменяются на более или менее ограниченные все функции,
которые так или иначе содержат в себе системные вызовы. Так, функции
memcpy или sprintf вполне можно оставить,
malloc придется заменить на эквивалент (в ядре
Linux эта функция называется kmaiioc), a fwrite
драйверу вряд ли понадобится, особенно если учесть, что работа многих
драйверов начинается до того, как будет смонтирована хоть одна файловая
система.
Важную роль среди сервисных функций занимают операции, часто исполняемые
одной командой, но такой, которую компиляторы ЯВУ в обычных условиях не
генерируют. Это, прежде всего, операции обращения к регистрам ввода-вывода
в машинах с отдельным адресным пространством ввода-вывода, а также команды
разрешения и запрещения прерываний. На С такие операции реализуются в
виде макроопределений, содержащих ассемблерную вставку.
Правила кодирования драйверов во многих ОС требуют, чтобы даже на машинах
с единым адресным пространством обращения к регистрам устройств происходили
посредством макросов. Такой код может быть легко портнро-ван на процессор
с отдельным адресным пространством. В наше время, когда одни и те же устройства
и одни и те же периферийные шины подключаются к различным процессорам,
портирование драйверов между различными процессорами осуществляется весьма
часто.
При портировании драйвера разработчик должен также принимать во внимание
различия в порядке байтов устройства и текущего процессора. Для приведения
этого параметра в соответствие обычно предоставляются функции или макросы
перестановки байтов как в одном слове, так и в блоках значительного размера.
|