2010-05-31 2 views
5

Я пытаюсь завершить изображение того, как ПК и ОС взаимодействуют друг с другом. И я нахожусь в точке, где я немного недооцениваю, когда речь идет о драйверах устройств.Драйверы устройств и Windows

Пожалуйста, не пишите такие вещи, как слишком сложные, или вам не нужно знать, когда используете высокопрограммные функции laguage и winapi. Я хочу знать, это для учебных целей.

Итак, самая простая структура того, как ОС и ПК (на ПК я имею в виду, конечно, HW), - это то, что я вижу, что все, кроме прямых команд ЦП, которые могут делать CPU сами по себе (арифметическая операция, ее регистры доступ и доступ к памяти) должны проходить через ОС. В основном из уровня 3 кольца вы не можете использовать входы и выходы, которые используются для сращивания других HW. Я знаю, что есть MMIO, но он должен быть установлен с помощью связи порта.

Это было не так все время. Даже я немного молод, чтобы помнить MSDOS, я знаю, что вы можете напрямую обращаться к HW, потому что там нет ограничений, нет режима звонка. Таким образом, вы можете написать строку для использования Diplay функцией DOS или напрямую использовать память видеокарты и написать ее самостоятельно.

Но по мере развития ОС этой возможности больше не существует. Но это прекрасно, поскольку ОС теперь обрабатывает всю коммуникацию HW, и, откровенно говоря, она более удобна и безопаснее (я бы сказал, единственный вариант) в многозадачной среде. Итак, теперь вы вместо того, чтобы использовать инструкции int для использования функции отображения BIOS или функции DOS, вы вызываете dll, которая внутренне обрабатывает все, о чем вам не нужно знать.

Я понимаю это. Я также понимаю, что драйверы устройств являются частью кода, который работает в кольцевом уровне 0, поэтому он может выполнять все взаимодействия HW. Но я не понимаю, есть ли связь между OS и драйвером устройства. Давайте возьмем пример - я хочу, чтобы звуковая карта издавала звук. Поэтому я вызываю Windows API для доступа к звуковой карте, но что происходит? Записывают ли Windows драйверы устройств?

Но если он вызывает драйвер устройства, означает ли это, что все драйверы устройств, которые могут быть вызваны функцией winAPI, должны иметь подпрограммы, названные определенным образом? Я имею в виду, когда у меня появилась новая звуковая карта, должны ли ее драйверы функционировать так же, как и старые? Так что Windows может фактически называть ту же функцию с ее точки зрения? Но если Windows имеет предопределенные наборы функций, исправленных драйверами устройств, то он не может использовать новые драйверы, которые существовали до выхода последней версии ОС.

Пожалуйста, помогите мне понять этот беспорядок. Я действительно злюсь. Благодарю.

ответ

7

Драйвер устройства Windows немного похож на DLL: за исключением того, что вместо динамической компоновки или загрузки приложения динамическое связывание/загрузка.

Записи реестра указывают O/S, какие существуют драйверы устройств (так что O/S знает, какие драйверы устройств динамически связаны/загружаются).

Драйверы устройств работают в кольце 0. В кольце нуль они (драйверы устройств) не имеют доступа (не могут ссылаться или использовать) API Windows: вместо этого они имеют доступ к различным API-интерфейсам ядра NT.

Но если он вызывает драйвер устройства, означает ли это, что все драйверы устройств, которые могут быть вызваны функцией winAPI, должны иметь подпрограммы, названные определенным образом? Я имею в виду, когда у меня появилась новая звуковая карта, должны ли ее драйверы функционировать так же, как и старые? Так что Windows может фактически называть ту же функцию с ее точки зрения?

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

Набор драйверов устройств Windows определяет различные API-интерфейсы и включает примеры драйверов для различных типов устройств.

Но если в Windows предусмотрены предопределенные наборы функций, исправленные драйверами устройств, то он не может использовать новые драйверы, которые существовали до выхода последней версии ОС.

O/S динамически связывается с функциями драйвера устройства: поскольку API-интерфейсы драйвера устройства предопределены, драйверы устройств являются взаимозаменяемыми в отношении O/S; новые драйверы устройств могут быть записаны при условии, что они поддерживают (совместимы с обратной совместимостью) с стандартным API драйверов устройств.

Механизм динамической компоновки очень похож на способ, с помощью которого объекты COM или классы C++ реализуют любой предопределенный чисто абстрактный интерфейс: заголовочный файл в DDK объявляет чисто абстрактный интерфейс (например, виртуальные функции), драйверы устройств реализовать эти функции, а O/S загружает драйверы и вызывает эти функции.

+0

Спасибо, хороший ответ. Могу ли я получить еще один? Если я правильно понимаю, для устройств, «известных» ОС, существует предопределенный набор имен функций и поэтому ОС может вызывать, например, функцию «get_sector()» независимо от того, какой контроллер используется для доступа к жесткому диску (SCSI, SATA, ATA. ..). Но если у меня есть новое устройство, с какой ОС не удается манипулировать с помощью WinAPI, могу ли я писать драйверы для него, а не называть их из своей программы? Благодарю. –

+0

@ b-gen-jack-o-neill - Да: приложения Windows могут использовать функцию [DeviceIoControl] (http://msdn.microsoft.com/en-us/library/aa363216.aspx) для отправки/получения произвольных данных к драйверу устройства. – ChrisW

0

Основы: Пожалуйста, обратите внимание, что это объяснение упрощается и когда-то верно лишь в большинстве случаев и не все.

Большинство устройств HW, с которыми вы когда-либо столкнетесь, будут иметь следующие основные операции: Запись в память (или регистры) на них. Чтение из памяти (или регистров) на них.

Этого достаточно для управления HW, чтобы предоставить ему нужные ему данные и получить нужные вам данные.

Эти области памяти отображаются в BIOS и/или операционной системы в физической области памяти на вашем компьютере (который в свою очередь может быть доступ к вашим водителем.)

Таким образом, мы теперь имеем две операции чтения и записи что драйвер устройства знает.

Кроме того, водитель может читать и писать способом, не связанным с процессором. Это называется Прямой доступ к памяти (DMA) и обычно выполняется вашим HW.

Последняя операция называется INTERRUPTS и предназначена для вашего HW, чтобы уведомить вашего водителя о чем-то, что только что произошло. Обычно это выполняется с помощью HW, прерывающего процессор и вызывающего драйвер для выполнения некоторой операции с высоким приоритетом. Например: изображение готово в HW для чтения драйвером.

 Смежные вопросы

  • Нет связанных вопросов^_^