Я ознакомился с несколькими базовыми классами операционных систем, сериями видео и т.д., И у меня возник этот вопрос относительно драйверов ОС против драйверов BIOS. Как базовая ОС узнает адрес памяти каждого устройства? Как ОС работает "из коробки" на любом компьютере. Существует ли стандартная схема памяти устройства, о которой все знают? Или операционная система перенаправит свой IVT на драйверы устройств BIOS? Пожалуйста, укажите мне на некоторые материалы для чтения по этой теме.
3 ответа
Как базовая ОС узнает адрес памяти каждого устройства? Как ОС работает "из коробки" на любом компьютере.
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".
Большинство операционных систем состоят из различных компонентов, таких как диспетчер памяти, ввод-вывод, диспетчер файловой системы и т.д. Несколько лет назад в монолитных операционных системах все было построено вместе. Большинство современных операционных систем имеют некоторый способ динамического изменения различных компонентов. Некоторые операционные системы, микроядры, имеют только базовую функциональность управления для операционной системы, причем большинство дополнительных компонентов, таких как файловая система, добавляются по частям.
Современные операционные системы также построены в виде ряда уровней, чем-то напоминающих модель OSI для сетевых стеков (см. Https://en.wikipedia.org/wiki/OSI_model), чтобы обеспечить максимальную независимость от реального оборудования, на котором они установлены. работает как можно скорее.
Таким образом, операционная система - это в основном абстрактная машина, в которую включены конкретные аппаратные модули. Существуют спецификации интерфейса, которые, как правило, являются чем-то вроде описания абстрактного компьютера, описывающего управление, а также данные и сервисы, которые аппаратные модули должны предоставлять операционной системе.
Таким образом, установщик для определенного стека драйверов устройств знает о его конкретных, конкретных потребностях в оборудовании и взаимодействует с устройством, но операционная система не знает этих конкретных конкретных потребностей в оборудовании. Операционная система делегирует все обычные устройства в стек драйверов устройств.
Я использую слово "стек", потому что функциональность, которая выполняет фактическую связь с устройством, обычно состоит из серии слоев. Это можно увидеть с помощью диспетчера устройств Windows на большинстве устройств, которые показывают набор файлов драйверов, которые используются для конкретного устройства.
Таким образом, существуют различные программные компоненты, которые на самом деле могут поставляться разными поставщиками.
Поэтому, если операционная система хочет узнать подробности об оборудовании, она запрашивает драйвер устройства для этих подробностей.
Операционная система работает «из коробки» на различных аппаратных платформах, потому что производители конкретного оборудования, составляющего платформу, предоставляют стек драйверов, необходимый операционной системе для работы на конкретном и конкретном оборудовании.
Различные операционные системы будут иметь разные спецификации интерфейса для драйверов устройств, которые операционная система предназначена для использования. Поэтому для 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.
На современном ПК каждый элемент оборудования сообщает некоторую основную информацию о себе, когда его спрашивают. Например, многие периферийные устройства подключены к шине 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) передает данные в операционную систему. Таким образом, ОС не нужно создавать для определенного набора устройств, она считывает эту информацию при запуске.