1

Насколько я понимаю, ядро обеспечивает связь между программным и аппаратным обеспечением, и поэтому ядро должно направлять системные вызовы, выполняемые приложениями ОС, правильно? Значит, разные карты адресов ввода / вывода означают, что ядро должно программироваться по-разному? Читайте ниже, поскольку я не верю, что сформулировал этот вопрос очень точно.

Позвольте мне уточнить, и, пожалуйста, поправьте меня, если я ошибаюсь, потому что именно так я понял то, что написано в нескольких статьях Я буду использовать семейство x86 в качестве основы для моих примеров. Процессоры x86 используют команду INT, а также индекс, называемый таблицей векторов прерываний, для сопоставления идентификатора INT с правильным расположением требуемой подпрограммы (подпрограмма и IVT, расположенные в BIOS, верно?). Сами подпрограммы написаны так, что они могут дать команду оборудованию, специфичному для компьютерной системы, выполнить задачу, основанную на протоколе используемого оборудования. Это позволяет ОС совершать системные вызовы и обмениваться данными с оборудованием, не имея никакого знания об оборудовании или отображении ввода / вывода, характерном для системы. Все, что необходимо для связи ОС с аппаратным обеспечением, - это идентификатор конкретного требуемого ISR. Поскольку ядро является связующим звеном между аппаратным и программным обеспечением, я предполагаю, что приложения, запускаемые ОС, не обязаны даже знать идентификатор ISR #, они просто сообщают ядру, что они хотят, например, записать данные X на жесткий диск, ядро передает данные X на правильный ISR, который затем записывает данные на жесткий диск. Таким образом, две системы, полностью идентичные за исключением того, что они используют разные идентификаторы ISR для разных задач, потребуют немного разных ядер?

И будет ли это также означать, что загрузочный сектор, который загружает ядро, также будет зависеть от сопоставления идентификатора ISR, поскольку для загрузки ядра потребуется выполнить системные вызовы для чтения с жесткого диска?

Я прошу прощения, если это не в том месте, но я прочитал, что это правильное место для вопросов, связанных с оборудованием. Спасибо!

1 ответ1

1

Что касается команд INTh, на которые вы ссылаетесь (см. « Вызовы прерываний BIOS»), вы правы, что именно таким способом ОС получала доступ к низкоуровневому оборудованию. На современном компьютере эти вызовы (если они выполняются) часто оказываются в CSM (модуль поддержки совместимости, по крайней мере, на языке AMI), который может обрабатывать эти запросы. В случае, скажем, вызова видео BIOS, который будет выполнять код в видео BIOS, если он присутствует. Я работал с Intel IGP в качестве разработчика BIOS, и как часть окончательного образа у нас был инструмент от Intel, в котором мы выпекаем их видео BIOS в виде большого двоичного объекта.

Аналогично, BIOS может реализовывать "эмулированные" версии вызовов для чтения / установки RTC. Современная ОС просто не будет выполнять все эти устаревшие обработчики, поскольку ей не нужно полагаться на BIOS для такой поддержки - например, может существовать драйвер ядра, который знает, как напрямую общаться с вашим PCH, чтобы связываться с Настройки RTC.

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

Аналогично, если вы посмотрите на стек хранения Linux ниже, то увидите, что базовые диски ядра заботятся об аппаратном взаимодействии без использования BIOS - весь исполняемый код взят из вашего ядра.

Теперь, что касается разных карт адресов ввода-вывода и тому подобного, напомним, что x86 имеет как адресное пространство ввода-вывода, так и адресное пространство памяти. Если вы вспомните Plug-and-Play, при загрузке ваш BIOS будет проходить и перечислять дерево PCI-устройств, которое для современных систем в основном охватывает все ваши периферийные устройства, по крайней мере, из POV SW (т.е. контроллер DRAM находится на Шина PCIe 0, ваши USB-контроллеры являются устройствами PCI от SW POV и т.д.). Используя BAR (регистры базовых адресов), BIOS знает, сколько памяти и какого типа требуется целевому устройству, и сделает все возможное, чтобы удовлетворить запрос.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .