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

часть 1:

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

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

часть 2:

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

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

1 ответов


Часть 1

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

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

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

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

Часть 2

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

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

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

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

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

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

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