где выполняется код драйвера устройства? Пространство ядра и пространство пользователя?
часть 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-е издание)