Какой язык программирования используется для написания программы BIOS?

65

Как я понимаю, код / ​​битовый поток BIOS, который содержится в ПЗУ, должен быть общим (работать вместе с несколькими типами процессоров или ISA). Кроме того, я увидел упомянутое в сети, что можно сбросить его код (и «разобрать» его).

Итак, на каком языке, в наборе команд или в машинном коде написано? Разве ему не нужен какой-либо процессор для выполнения своих операций? Если да, то я предполагаю, что он будет использовать внешний процессор, тогда как он узнает конкретный набор команд используемого?

Может быть, у него есть внутренний процессор?

отражение
источник
9
Возможный дубликат Как работают компьютеры?
Комнат
39
Перекрестная публикация достаточно плоха, но когда она заканчивается в Горячих Сетевых Вопросах в обеих версиях , это выходит за рамки ...
Мейсон Уилер
8
«Код BIOS / поток битов, который содержится в ПЗУ, должен быть общим (работать вместе с несколькими типами процессоров или ISA)». - Я никогда не слышал о BIOS, который работает с несколькими ISA. У вас есть пример?
CHX
6
As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). Я бы сказал «Нет, как раз наоборот»
edc65
11
Это даже отдаленно не дублирует такой общий вопрос, как «Как работают компьютеры?». Пожалуйста, не закрывайте как дупе.
Андрес Ф.

Ответы:

103

БИОСы были написаны исключительно на ассемблере, но переход был сделан давно, чтобы написать большую часть кода на каком-либо языке более высокого уровня, и оставить на ассемблере как можно меньше его частей, предпочтительно только загрузчик, (первые несколько сотен инструкций, к которым процессор переходит после запуска / сброса) и все подпрограммы, связанные с конкретными особенностями базовой архитектуры.

BIOS уже писались в основном на C еще в начале девяностых. (Я написал BIOS на 90% C, сборка 10% в начале девяностых.)

Что также очень помогло в этом направлении:

  • Библиотеки C, предназначенные для конкретной архитектуры и включающие функции для работы с особенностями этой архитектуры, например, функции для чтения / записи байтов в / из портов ввода-вывода архитектуры x86. Microsoft C всегда предлагал библиотечные функции для такого рода вещей.

  • Компиляторы C, которые не только нацелены на конкретную архитектуру ЦП, но даже предлагают расширения для языка С, которые можно использовать для написания кода, использующего специальные функции ЦП. Например, архитектура x86 поддерживает вещи, известные как прерывания, которые вызывают подпрограммы, известные как обработчики прерываний, и требует, чтобы они имели специальные последовательности команд входа / выхода. С самого начала Microsoft C поддерживал специальные ключевые слова, которые можно было использовать для обозначения функции как обработчика прерываний, чтобы она могла вызываться непосредственно прерыванием ЦП, поэтому вам не нужно было писать для нее какую-либо сборку.

В настоящее время я предполагаю, что большая часть BIOS написана на C ++, если не на каком-либо языке более высокого уровня.

Подавляющее большинство кода, составляющего BIOS, относится к конкретному аппаратному обеспечению, поэтому его не нужно переносить: гарантируется, что он всегда будет работать на одном и том же типе CPU. Процессор может развиваться, но пока он поддерживает обратную совместимость с предыдущими версиями, он все еще может работать с BIOS без изменений. Кроме того, вы всегда можете перекомпилировать части BIOS, написанные на C, для естественной работы на любом новом процессоре, который появится, если возникнет такая необходимость.

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

Майк Накис
источник
7
Да. Иногда вы можете даже привязать материнскую плату не только к конкретной архитектуре процессора, но даже к конкретному поставщику процессора. В настоящее время вы можете купить материнскую плату x86, которая совместима только с процессорами Intel x86, или материнскую плату x86, которая совместима только с процессорами AMD x86. BIOS в этих материнских платах будет в значительной степени идентичен, поскольку в обоих случаях процессор понимает набор инструкций x86, и большинство периферийных устройств идентичны, но некоторые периферийные устройства имеют различия, которые должен учитывать BIOS.
Майк Накис
4
@Reflection внимательно посмотрите на то, как физически выглядит материнская плата. Сокет ЦП будет иметь определенное расположение выводов, которое зависит от семейства ЦП, которые он принимает. Вы физически не можете подключить, скажем, Intel P4 к материнской плате AMD Opteron
Caleth
14
Термин «BIOS» относится к «базовой системе ввода / вывода» ПК, поэтому наличие BIOS подразумевает процессор x86. Системы IA64 имеют EFI вместо BIOS, системы PowerPC могут иметь систему Open Firmware или проприетарную систему, системы Sparc также имеют OFW (или, скорее, OpenBoot), OLPC X0 - это система на базе x86, которая использует OFW. Даже ПК больше не используют BIOS, они переключились на (U) EFI. OB / OFW интересен тем, что он не только переносимый, но и кроссплатформенный. Драйверы OFW будут работать в любой системе OFW, они «Write Once Run Anywhere», независимо от ISA процессора.
Йорг Миттаг,
14
«В настоящее время я бы предположил, что большая часть BIOS написана на C ++». Я не обязательно предполагал бы, что это может быть правдой, но я работаю в этой отрасли, и, конечно, многие загрузчики написаны на простом C. Люди, которые пишут такие часто это «старая гвардия», и они до сих пор не полностью доверяют С ++.
Сэм
6
@TomDworzanski: Хотя технически это не BIOS (который относится исключительно к старому PC-компоненту 1981 года), многие реализации открытого программного обеспечения IEEE-1275 (которое используется для той же роли, что и BIOS на Sparc, общей аппаратной эталонной платформе PowerPC (например, PowerMac, PowerBook), ноутбук стоимостью $ 100 OLPC X0-1) написаны частично на языках, отличных от ассемблера / C. OpenBoot , Open Firmware , OpenBIOS - все содержит…
Йорг Миттаг,
11

Хотя теоретически можно писать 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 и / или сборку. Возможно, однажды будут использованы другие технологии. Но сегодня выбор четко определен.

Рич Смит
источник
4
Это немного придирчиво, но C # и Java не интерпретируются. Они компилируются в байт-код. Это байт-код, который затем обрабатывается интерпретатором. Не меняет логику первого абзаца.
Тонни
1
@ Тонни Это правильно. Я добавил «прямо или промежуточно истолковано», чтобы быть немного более ясным.
@ Тонны, как правило, скорее джиттер, чем интерпретатор, что является важным отличием, потому что можно предварительно сделать все до исходного, пока не используются определенные динамические методы. Таким образом, теоретически было бы возможно написать BIOS на языках .NET или Java, если бы кто-то сделал это и убедился, что вся необходимая поддержка во время выполнения была доступна. Я предполагаю, что усилия, предпринимаемые для этого, более чем затмят любое удобство, найденное, хотя.
Джон Ханна
1
@Tonny На самом деле C # компилируется в нативный код msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx, поэтому странно видеть его в списке слабых / динамических языков.
День
@Den C # обычно не компилируется в нативный код. Этот .Net Native продукт, на который вы ссылаетесь, еще не был официально выпущен. Из того, что я прочитал, он скомпилирует код приложения и необходимый код платформы в исполняемый файл. Согласно часто задаваемым вопросам, изначально это будет предназначаться для приложений Магазина Windows, поэтому может потребоваться некоторое время для более широкой поддержки. При всем этом, похоже, что Microsoft может отойти от модели виртуальной машины в будущем, если все пойдет хорошо.
4

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

Но возможно, вы думаете о дополнительных ПЗУ (которые иногда называются BIOS, как в «Video BIOS» для дополнительного ПЗУ GPU)?

Для реальных устаревших совместимых с BIOS дополнительных ПЗУ они, вероятно, будут зависимым от ISA исполняемым кодом (опять же генерируемым любым языком, который может быть скомпилирован для целевой архитектуры); PCI также позволяет включать код для нескольких ISA и позволяет хосту выбирать соответствующий двоичный образ во время процесса загрузки.

Для дополнительных ПЗУ, совместимых с UEFI, также существует независимый от архитектуры формат байтового кода, который можно запускать на разных архитектурах, но также можно использовать ISA-зависимый код.

lxgr
источник