Где выполняется код драйвера устройства? Ядро или пространство пользователя?

Часть1:

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

Я знаю, что код, который выполняется в пространстве ядра, имеет некоторые дополнительные привилегии, такие как доступ к любой ячейке памяти (правильно, если я ошибаюсь). Если мы установим сторонний драйвер, и если он будет работать в пространстве ядра, разве это не будет вредно для всей системы? Как любая ОС справляется с этим?

Ч .2:

Давайте возьмем пример устройства USB (камера, клавиатура..), Как система распознает эти устройства? как система знает, какой драйвер установить? Как драйвер знает адрес устройства для чтения и записи данных?

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

Ответ 1

Часть 1

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

Тенденция, наблюдаемая в ядрах MacOSX и Window NT, - это драйверы пользовательского пространства. Microsoft в течение некоторого времени нажимает Windows Serverpace Driver Framework, а MacOSX уже давно предоставляет API-интерфейсы пользовательского пространства для драйверов Firewire и USB, а также совместимые с классом драйверы для многих USB-устройств периферийные устройства. довольно необычно устанавливать сторонние драйверы устройств режима ядра на MacOSX.

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

Драйверы графической подсистемы Linux практически полностью реализованы в пользовательском пространстве с минимальной частью резидентности ядра, а Fuse позволяет реализовать системы регистрации в пользовательских пространствах, пространство.

Часть 2

USB, Firewire, MCI (а также PCI-e) имеют механизмы перечисления, через которые драйвер шины может соответствовать устройству драйверу. На практике это означает, что все устройства обнаруживают метаданные, описывающие, что они собой представляют.

В метаданных содержится идентификатор DeviceID, VendorID и описание функций, которые предоставляет устройство, и связанных с ним идентификаторов классов. ClassIDs облегчают общие драйверы классов.

Понятно, что операционная система попытается найти драйвер, который специально поддерживает VendorID и DeviceID, а затем вернется к той, которая поддерживает ClassID (ы).

Сравнение устройств с драйверами является основной концепцией в основе модели устройств Linux, а точные критерии соответствия, используемые для сопоставления, - это функция match() на конкретной шине драйвер.

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

Дерево документации Linux дает некоторое представление о дизайне модели устройств Linux, но на самом деле это не чтение начального уровня.

Я также рекомендую читать драйвер устройства Linux (3-е издание)