Вопрос о драйверах устройств и ядрах
====================================

В настоящее время моя ОС загружается с дискеты. Поскольку драйвер гибких дисков устарел, я планирую изменить загрузочный носитель.

Как я пытаюсь понять, что использовать загрузочный носитель, я понимаю, что независимо от того, что я выбираю, мне нужно написать драйвер устройства для него. Хотя BIOS реального режима может предоставить мне некоторые прерывания для взаимодействия с этим устройством, я сам один раз вступил в защищенный режим. Поэтому я начинаю читать < Linux Device Driver 3rd edition > для некоторого руководства. Но эта книга посвящена написанию драйвера устройства  **для системы Linux**. Таким образом, это означает, что драйверы устройств относятся к операционной системе.

Теперь у меня появились следующие вопросы:

* В каких аспектах драйвер устройства зависит от операционной системы?
* Как отображаются операционные системы и устройства в памяти?
* Как драйверы операционной системы и устройства взаимодействуют друг с другом?
* Если я горячо подключаюсь к устройству, как операционная система знает, где найти правильный драйвер устройства?

 

Драйвер устройства представляет собой фрагмент кода, который реализует интерфейс между устройством и (обычно) ядром операционной системы. В этом отношении он обязательно зависит от операционной системы, на которую он нацелен - это основная цель, позволяющая этой операционной системе знать об устройстве и позволить ему использовать его функции.

Это не означает, что код для драйвера устройства не может использоваться для разных ОС. Некоторые из них могут быть переносимыми (сторона устройства), но сторона интерфейса (которая взаимодействует с ОС) зависит от API, который определяет/предоставляет ОС.

Макет в памяти полностью зависит от системы. Для драйверов и других сервисов ядра не обязательно должны быть какие-либо конкретные политики макета памяти. Само устройство может очень навязывать ограничения макета памяти, но это другая тема.

ОС определяет, как она взаимодействует с драйверами устройств через API. У вас есть документация о том, как Linux делает это в этой (большой) книге. Другие операционные системы могут делать это по-другому - разработчики ОС устанавливают правила. Если вы создаете ядро, вы определяете API.

Горячая вилка не легка. Одним из способов выполнения сопоставления является использование некоторой формы таблицы поиска с информацией с устройства в виде "ключа" и подходящей структуры/указателя драйвера/как значения или наоборот (с API в ваших драйверах что позволяет узнать, какие идентификаторы устройств могут обрабатывать). Идентификаторами устройств могут быть идентификаторы устройств PCI, идентификаторы USB,... зависит от шины и типа устройства.