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

532
Gilles

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

2

3 ответа на вопрос

2
user996142

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

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

Что касается памяти и ввода / вывода (надеюсь, вы знаете, что в x86 есть 2 пробела: память и ввод / вывод, верно?), Было много стандартов.

Первая эра ПК

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

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

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

Эра 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 может описывать память, ввод-вывод и «методы» (также написанные на AML) для выполнения некоторых вещей, таких как «изменение яркости».

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

0
Richard Chambers

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

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

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

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

Я использую слово «стек», потому что функциональность, которая выполняет фактическую связь с устройством, обычно состоит из серии слоев. Это можно увидеть с помощью диспетчера устройств Windows на большинстве устройств, которые показывают набор файлов драйверов, которые используются для конкретного устройства. enter image description here

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

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

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

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

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

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

Посмотрите на это обсуждение https://www.quora.com/What-is-the-best-book-on-operating-systems

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

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

Это на самом деле не отвечает на вопрос. Вы объясняете, как можно спроектировать ОС, а не то, как она получает информацию об оборудовании, и в этом суть вопроса. Gilles 6 лет назад 0
@Gilles «Так что, если операционная система хочет узнать подробности об оборудовании, она запрашивает драйвер устройства для этих деталей». Richard Chambers 6 лет назад 0
Это предложение не имеет особого смысла, так как драйвер является частью ОС. Gilles 6 лет назад 0
Драйвер @Gilles - это компонент, используемый операционной системой. Это может быть частью ОС, но ни одна крупная ОС не делает это таким образом, поэтому такие вещи, как Windows Plug and Play, работают. Richard Chambers 6 лет назад 0
Драйверы * являются * частью операционных систем, таких как Windows. Вы можете путать «операционную систему» ​​с «ядром». Тем не менее, многие основные ОС включают драйверы в ядро, например, Linux и * BSD. Gilles 6 лет назад 0
@ Жиль нет Я не путаю ядро ​​с операционной системой. Драйверы являются программными компонентами. Они могут динамически загружаться операционной системой по мере необходимости или могут быть встроены в операционную систему для специальных целей или конкретных целей. Чаще всего гибкость динамической загрузки выбирается таким образом, чтобы драйверы могли быть заменены или обновлены или что-либо еще. Намного проще выгрузить и перезагрузить драйвер устройства динамически, чем сборку ОС с новым драйвером. Richard Chambers 6 лет назад 0
0
Gilles

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

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

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

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

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