Как я понимаю, код / битовый поток BIOS, который содержится в ПЗУ, должен быть общим (работать вместе с несколькими типами процессоров или ISA). Кроме того, я увидел упомянутое в сети, что можно сбросить его код (и «разобрать» его).
Итак, на каком языке, в наборе команд или в машинном коде написано? Разве ему не нужен какой-либо процессор для выполнения своих операций? Если да, то я предполагаю, что он будет использовать внешний процессор, тогда как он узнает конкретный набор команд используемого?
Может быть, у него есть внутренний процессор?
As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs).
Я бы сказал «Нет, как раз наоборот»Ответы:
БИОСы были написаны исключительно на ассемблере, но переход был сделан давно, чтобы написать большую часть кода на каком-либо языке более высокого уровня, и оставить на ассемблере как можно меньше его частей, предпочтительно только загрузчик, (первые несколько сотен инструкций, к которым процессор переходит после запуска / сброса) и все подпрограммы, связанные с конкретными особенностями базовой архитектуры.
BIOS уже писались в основном на C еще в начале девяностых. (Я написал BIOS на 90% C, сборка 10% в начале девяностых.)
Что также очень помогло в этом направлении:
Библиотеки C, предназначенные для конкретной архитектуры и включающие функции для работы с особенностями этой архитектуры, например, функции для чтения / записи байтов в / из портов ввода-вывода архитектуры x86. Microsoft C всегда предлагал библиотечные функции для такого рода вещей.
Компиляторы C, которые не только нацелены на конкретную архитектуру ЦП, но даже предлагают расширения для языка С, которые можно использовать для написания кода, использующего специальные функции ЦП. Например, архитектура x86 поддерживает вещи, известные как прерывания, которые вызывают подпрограммы, известные как обработчики прерываний, и требует, чтобы они имели специальные последовательности команд входа / выхода. С самого начала Microsoft C поддерживал специальные ключевые слова, которые можно было использовать для обозначения функции как обработчика прерываний, чтобы она могла вызываться непосредственно прерыванием ЦП, поэтому вам не нужно было писать для нее какую-либо сборку.
В настоящее время я предполагаю, что большая часть BIOS написана на C ++, если не на каком-либо языке более высокого уровня.
Подавляющее большинство кода, составляющего BIOS, относится к конкретному аппаратному обеспечению, поэтому его не нужно переносить: гарантируется, что он всегда будет работать на одном и том же типе CPU. Процессор может развиваться, но пока он поддерживает обратную совместимость с предыдущими версиями, он все еще может работать с BIOS без изменений. Кроме того, вы всегда можете перекомпилировать части BIOS, написанные на C, для естественной работы на любом новом процессоре, который появится, если возникнет такая необходимость.
Причина, по которой мы пишем BIOS на языках более высокого уровня, чем на ассемблере, заключается в том, что писать их проще, а не потому, что они действительно должны быть переносимыми.
источник
Хотя теоретически можно писать BIOS на любом языке, современная реальность заключается в том, что большинство BIOS пишется с использованием Assembly, C или их комбинации .
BIOS должен быть написан на языке, который может компилироваться в машинный код , понятный физическому аппаратному компьютеру. Это устраняет языки с прямой или промежуточной интерпретацией (Perl, Python, PHP, Ruby, Java, C #, JavaScript и т. Д.) Как подходящие для написания BIOS. (Хотя, теоретически, можно реализовать один из этих языков либо для прямой компиляции в статический машинный код, либо встроить интерпретатор в BIOS. Например, есть проект GCJ для Java, созданный на основе программного обеспечения).
Большинство OEM-производителей внедряют BIOS, расширяя проприетарные, универсальные реализации BIOS такими компаниями, как American Megatrends и Phoenix Techologies . (Вероятно, вы уже видели одну из этих компаний, отображенную на первом экране загрузки компьютера.) Исходный код для этих реализаций не является общедоступным, но некоторые из них утекли. Я не хочу ссылаться на это непосредственно на C и исходный код сборки, но в Интернете есть места, где обсуждается этот исходный код для тех, кто хочет заглянуть.
Некоторые производители оборудования, например производители, ориентированные на высокопроизводительные и игровые рынки, насыщают свои реализации BIOS функциями настройки, статистикой и привлекательными пользовательскими интерфейсами, разработанными для их точных реализаций. Многие из этих функций выходят за рамки того, что предлагается в универсальных продуктах, выпускаемых American Megatrends и другими. К сожалению, эти компании часто рассматривают выпуск своего исходного кода как угрозу безопасности , поэтому об этих реализациях высокого уровня известно мало, потому что о них мало что известно. Конечно, можно найти способы доступа и декомпиляции таких реализаций BIOS, но это может быть трудным и, возможно, незаконным.
Возвращаясь к первоначальному вопросу, из-за необходимости создавать собственный машинный код, BIOS должен быть реализован на языке программирования, поддерживаемом компилятором машинного кода . Хотя таких языков много, и хотя я уверен, что за последние несколько десятилетий в экспериментах использовалось несколько языков, каждая открытая реализация BIOS, которую я смог найти, специально основана на комбинации C и / или сборки. Реализации BIOS с открытым исходным кодом, на которые я смотрел, чтобы сформировать этот вывод, включают OpenBIOS , tinyBIOS , coreboot , Intel BIOS и Libreboot, Я также рассмотрел некоторые очень старые реализации BIOS, которые не актуальны сегодня, но также следовали правилу C и / или сборки.
Я думаю также уместно взглянуть на другое программное обеспечение, созданное для непосредственного взаимодействия с оборудованием. Мы знаем, например, что ядро Linux , то OS X ядро и ядро Windows , в основном C с некоторой сборкой и некоторыми высокоуровневыми языками для выполнения конкретных задач. Мы также знаем, что аппаратные драйверы для Linux и аппаратные драйверы для Windows написаны в основном на C.
Возвращаясь к BIOS, я думаю, что также важно учитывать экономику выбранного языка программирования. BIOS обычно пишется как необходимость дополнять продажи оборудования. Известно, что современные системы BIOS в основном написаны на C и / или на ассемблере. Переход к другому инструменту привел бы к значительным затратам к тому, что обычно считается товарной продукцией, что может очень негативно повлиять на продажи. Не вдаваясь в экономику 101, я могу заверить вас, что, возможно, ОЕМ-изготовителю не стоит отказываться от проверенных временем инструментов, проверенных десятилетиями.
Конечно, есть и будут проекты для любителей писать BIOS. Похоже, что они тоже до сих пор выбирают C и / или сборку. Возможно, однажды будут использованы другие технологии. Но сегодня выбор четко определен.
источник
Фактический BIOS для компьютера был бы написан на некотором языке (вероятно, C или сборке), который скомпилирован в зависимый от архитектуры двоичный код; этот код не может работать на любой другой архитектуре (и, возможно, в этом нет необходимости, поскольку он уже очень специфичен для машины, с которой он поставляется).
Но возможно, вы думаете о дополнительных ПЗУ (которые иногда называются BIOS, как в «Video BIOS» для дополнительного ПЗУ GPU)?
Для реальных устаревших совместимых с BIOS дополнительных ПЗУ они, вероятно, будут зависимым от ISA исполняемым кодом (опять же генерируемым любым языком, который может быть скомпилирован для целевой архитектуры); PCI также позволяет включать код для нескольких ISA и позволяет хосту выбирать соответствующий двоичный образ во время процесса загрузки.
Для дополнительных ПЗУ, совместимых с UEFI, также существует независимый от архитектуры формат байтового кода, который можно запускать на разных архитектурах, но также можно использовать ISA-зависимый код.
источник