Драйверы операционных систем против драйверов BIOS

Драйверы операционных систем против драйверов BIOS

Я прошел несколько базовых курсов по операционным системам, видеосерий и т. д. и у меня возник вопрос относительно драйверов ОС и драйверов BIOS. Как базовая ОС узнает адрес памяти каждого компонента оборудования? Как ОС работает из коробки на любом компьютере. Существует ли стандартная структура памяти устройства, о которой все знают? Или ОС перенаправит свой IVT, чтобы указать на драйверы устройств BIOS? Пожалуйста, порекомендуйте мне какой-нибудь материал для чтения по этой теме.

решение1

Как базовая ОС знает адрес памяти каждого элемента оборудования? Как ОС работает из коробки на любом компьютере.

Процессор знает только первый адрес для выполнения. BIOS/прошивка должны «отвечать» на этот адрес, чтобы процессор мог загрузиться.

А для памяти и ввода-вывода (надеюсь, вы знаете, что в x86 есть два пространства: память и ввод-вывод, верно?) существовало множество стандартов.

Первая эра ПК

В памяти была полуофициальная область, называемая BIOS DATA AREA. Она содержала некоторую информацию о количестве портов COM и LPT, контроллерах дисководов, их базовых адресах ввода-вывода и т. д. ОС также использовала вызовы BIOS (задокументированопрерывания) для доступа к оборудованию. Поставщик материнской платыжестко закодированочто обращается к BIOS. Некоторые устройства имели официально задокументированные адреса ввода-вывода.

Карты расширения, такие как ISA, не имели никаких инструментов для обнаружения, кроме BIOS карт расширения: системный BIOS сканировал память на предмет специальных шаблонов, чтобы найти BIOS карты расширения и запустить его. BIOS карты мог установить себя как вектор прерываний, чтобы «затенить» функции BIOS для включения сетевой загрузки и т. д.

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

Эра PnP

PnP — это пакет спецификаций по обнаружению оборудования. Были ISA PNP, COM PORT PNP, LPT PNP и т. д. Спецификации описывают, что программное обеспечение должно делать для проверки того, какое устройство подключено, и как устройство должно действовать. Некоторые шины, такие как PCI, имеют встроенную возможность PNP. Программное обеспечение может перечислить все карты на PCI и спросить их о необходимых им ресурсах, их поставщике и классе (чтобы найти драйвер) и т. д., а затем настроить их. Перечисление также возможно для USB.

«Программное обеспечение» в этом случае может быть PNPBIOS или ОС с поддержкой PNP. Таким образом, BIOS использовала эти спецификации для поиска загрузочного устройства и моста PCI Host («корня» шины PCI) и сохраняла эту информацию в специальных таблицах в памяти (согласно спецификации PNPBIOS), а ОС считывала их и использовала возможности PCI и USB для перечисления и включения устройств (протоколы PCI и USB документированы).

Эра ACPI

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

Специальная таблица под названием DSDT описывает любое системное устройство, включая специальные кнопки ноутбука, аккумулятор ноутбука, вентиляторы, корневой комплекс PCI-Express и т. д.

Устройства описываются на языке AML, и ОС должна иметь свой интерпретатор. DSDT может описывать память, IO и «методы» (также написанные на AML) для выполнения некоторых действий, например «изменения яркости».

ACPI — огромная спецификация. ОС использует DSDT для заполнения своего внутреннего «дерева устройств» и, получив доступ к «корневому комплексу PCI-Express» или корневому USB, она использует протоколы PCI-Express и USB для дальнейшего перечисления и настройки: карта может сообщить, что поддерживает диапазоны памяти A и B, и ОС настраивает ее на использование «B».

решение2

Большинство операционных систем состоят из различных компонентов, таких как менеджер памяти, ввод-вывод, менеджер файловой системы и т. д. Много лет назад в монолитных операционных системах все было построено вместе. Большинство современных операционных систем имеют некоторый способ динамического изменения различных компонентов. Некоторые операционные системы, микроядра, имеют только базовую функциональность управления для операционной системы, а большинство дополнительных компонентов, таких как файловая система, являются надстройками.

Современные операционные системы также построены в виде ряда уровней, что-то вроде модели OSI для сетевых стеков (см.https://en.wikipedia.org/wiki/OSI_model) для того, чтобы обеспечить максимальную независимость от фактического оборудования, на котором они работают.

Итак, операционная система в основном является абстрактной машиной, в которую вставлены конкретные, аппаратно-специфические модули. Существуют спецификации интерфейсов, которые, как правило, являются своего рода абстрактным описанием машины, описывающим управление, данные и услуги, которые аппаратно-специфические модули должны предоставлять операционной системе.

Итак, установщик для определенного стека драйверов устройств знает о его конкретных аппаратных потребностях и интерфейсах к устройству, но операционная система не знает этих конкретных аппаратных потребностей. Операционная система делегирует все грубые специфичные для устройств вещи стеку драйверов устройств.

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

Таким образом, существуют различные программные компоненты, которые на самом деле могут поставляться разными поставщиками.

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

Операционная система работает «из коробки» на различных аппаратных платформах, поскольку поставщики конкретного оборудования, входящего в состав платформы, предоставляют стек драйверов, необходимый операционной системе для работы на конкретном и определенном оборудовании.

Различные операционные системы будут иметь различные спецификации интерфейса для драйверов устройств, которые операционная система должна использовать. Поэтому для Linux у вас должны быть совместимые с операционной системой Linux драйверы, которые предоставляют интерфейс драйвера Linux. Для Windows у вас должны быть драйверы интерфейса Windows.

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

Существует множество книг об операционных системах, а также множество проектов с открытым исходным кодом для различных операционных систем.

Взгляните на это обсуждениеhttps://www.quora.com/Какая-лучше-книга-по-операционным-системам

Существует ряд бесплатных онлайн-книг, таких какhttp://pages.cs.wisc.edu/~remzi/OSTEP/

И взгляните на эту страницу github об операционных системах с открытым исходным кодом.https://github.com/showcases/open-source-operating-systems

решение3

На современном ПК каждое устройство сообщает некоторую базовую информацию о себе, когда его спрашивают. Например, многие периферийные устройства подключены кPCI-шина. Когда ОС хочет узнать, какие периферийные устройства подключены к шине PCI, она посылает на шину инструкцию, запрашивающую у каждого периферийного устройства отправку описания. Это называетсяперечисление(устройства на) шине. Это описание использует числовой код для идентификации каждой модели устройства, называемойPCI-идентификатор. Когда ОС обнаруживает наличие устройства с определенным идентификатором PCI, она пытается загрузить драйвер для этого идентификатора PCI; если у ОС нет драйвера, она может попытаться загрузить его или сообщить пользователю о наличии неизвестного устройства.

Например, в Linux вы можете запустить команду lspciдля вывода списка устройств PCI. Она имеет различные опции для отображения различных видов информации, поиграйте немного, если вам интересно. Я описываю механизм, который Linux использует для загрузки драйвера для устройства PCI вэтот ответ. Это всего лишь один пример; другие операционные системы для ПК имеют механизм, позволяющий делать то же самое, но этот механизм может быть совершенно другим.

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

Различные архитектуры машин могут иметь или не иметь способы перечисления присутствующих драйверов. Например, ПК до середины 1990-х годов не имели таких методов. До появления шины PCI существовалаISA-шина. На шине ISA, если вы хотите узнать, присутствует ли устройство по определенному адресу, вы отправляете ему команду. Если вы получаете ответ, который понимаете, хорошо. Если команда блокирует компьютер или вызывает непреднамеренный эффект, потому что есть совершенно другое периферийное устройство, то это плохо. На ПК 1908-х годов ОС запрашивала BIOS о настроенных устройствах (но BIOS не перечислял все устройства, а только типы устройств, о которых BIOS знал), и пользователь, установивший карту расширения, должен был предоставить сведения о ее конфигурации либо в BIOS, либо в конфигурации ОС. BIOS включал некоторые базовые драйверы для клавиатуры и экрана, и операционные системы, такие как DOS, вызывали эти драйверы; другие ОС (или приложения) могли обращаться к оборудованию напрямую (особенно для дисплея, поскольку драйверы BIOS были медленными и ограниченными).

Даже сегодня большинство встроенных систем не имеют способа перечислить встроенные периферийные устройства. Многие устройства (особенно на базе ARM, но не только) описывают свои периферийные устройства в структуре данных, называемойдерево устройств. Эта структура данных хранится в ПЗУ или флэш-памяти изагрузчик(эквивалент BIOS) передает данные операционной системе. Таким образом, ОС не обязательно должна быть создана для определенного набора устройств, она считывает эту информацию при запуске.

Связанный контент