Яка мова програмування використовується для написання програми 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 в 90% С, 10% збірка на початку дев'яностих.)

Що також дуже допомогло в цьому напрямку:

  • Бібліотеки C, орієнтовані на конкретну архітектуру і включають функції для роботи з особливостями цієї архітектури, наприклад, функції для читання / запису байтів в порти вводу / виводу архітектури x86. Microsoft C завжди пропонувала бібліотечні функції для подібних матеріалів.

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

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

Переважна більшість коду, що складається з BIOS, є специфічним для базового обладнання, тому воно не має справді бути портативним: гарантується, що він завжди буде працювати на однотипному процесорі. Процесор може розвиватися, але поки він підтримує зворотну сумісність з попередніми версіями, він все ще може запускати 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 можуть мати систему відкритих вбудованих програм або фірмову систему, Sparc також має OFW (вірніше OpenBoot), OLPC X0 - система на базі x86, яка використовує OFW. Навіть комп'ютери вже не використовують BIOS, вони перейшли на (U) EFI. OB / OFW цікавий тим, що розроблений таким чином, щоб він був не тільки портативним, але й кросплатформенним. Драйвери OFW працюватимуть у будь-якій системі OFW, вони є "Пишіть один раз запустити будь-де", незалежно від ISA CPU.
Йорг W Міттаг

14
"Сьогодні я б припускав, що більша частина BIOS написана на C ++" Я не обов'язково припускаю, що це може бути правдою, але я працюю в цій галузі, і, звичайно, багато завантажувачів написано простою С. Люди, які пишуть такий вид речі часто є "старою гвардією" і, як правило, не повністю довіряють C ++.
Сем

6
@TomDworzanski: Хоча технічно це не BIOS (який стосується виключно старого ПК в 1981 році), багато реалізацій IEEE-1275 Open Firmware (який використовується для аналогічної ролі як BIOS на Sparc, загальної опорній платформі PowerPC Hardware Reference (наприклад, PowerMac, PowerBook), 100-доларовий ноутбук OLPC X0-1) написані частково іншими мовами, ніж збірка / С. OpenBoot , Open Firmware , OpenBIOS всі містять…
Jörg W Mittag

11

Хоча теоретично можна писати BIOS будь-якою мовою, сучасна реальність більшості BIOS пишеться за допомогою зборки, C або комбінації двох .

BIOS повинен бути написаний мовою, яка може компілювати до машинного коду , що розуміється фізичною апаратною машиною. Це виключає інтерпретовані безпосередньо чи проміжні мови (Perl, Python, PHP, Ruby, Java, C #, JavaScript тощо) як відповідні для написання BIOS. (Хоча теоретично можна було реалізувати одну з цих мов для компіляції безпосередньо до статичного машинного коду, або можна якось вставити інтерпретатор в BIOS. Існує, наприклад, проект GCJ для залишення програмного забезпечення для Java.)

Більшість виробників оригіналу впроваджують BIOS шляхом розширення фірмових, загальних реалізацій BIOS таких компаній, як американські Megatrends та Phoenix Techologies . (Ви, напевно, раніше бачили, що одна з цих компаній відображалася на першому завантажувальному екрані комп’ютера.) Вихідний код для цих реалізацій не є загальнодоступним, але частина його просочилася. Я не хочу посилатися на це безпосередньо на вихідний код C та збірки, але в Інтернеті є місця, де цей вихідний код обговорюється для тих, хто хоче заглянути.

Деякі виробники обладнання, наприклад, орієнтовані на високопродуктивні та ігрові ринки, насичують їх реалізацію BIOS функціями налаштування, статистикою та привабливими користувацькими інтерфейсами, призначеними для їх точної реалізації. Багато з цих особливостей виходять за рамки того, що пропонується в генеричних продуктах, вироблених американськими мегатрендами та іншими. На жаль, ці компанії часто сприймають випуск свого вихідного коду як ризик для безпеки , тому про ці високі версії реалізовано мало відомо, оскільки про них мало спільного. Звичайно, можна знайти способи доступу та декомпіляції таких реалізацій BIOS, але це може бути важким і, можливо, незаконним.

Повернувшись до початкового питання, через необхідність створення кодового машинного коду, BIOS повинен був бути реалізований мовою програмування, підтримуваною нативним компілятором машинного коду . Незважаючи на те, що таких мов багато, і хоча я впевнений, що протягом останніх десятиліть кілька експериментів використовувались в експерименті, кожна відкрита реалізація BIOS, яку я змогла знайти, спеціально покладається на комбінацію C та / або збірки. Реалізації BIOS з відкритим джерелом, які я розглядав, щоб сформулювати цей висновок, включають OpenBIOS , tinyBIOS , coreboot , Intel BIOS та Libreboot. Я також переглянув деякі дуже старі реалізації BIOS, які не є актуальними сьогодні, але також дотримувались правила C та / або складання.

Я думаю, що також доречно переглянути інше програмне забезпечення, побудоване для прямої взаємодії з обладнанням. Ми знаємо, наприклад, що ядро Linux , то OS X ядро і ядро Windows , в основному C з деякою збірки і деяких високорівневих мов для виконання конкретних завдань. Ми також знаємо, що драйвери апаратного забезпечення для Linux та драйвери апаратного забезпечення для Windows написані значною мірою на C.

Повертаючись до BIOS, я думаю, що також важливо враховувати економіку обраної мови програмування. В основному BIOS пишеться як необхідність доповнити продажі обладнання. Як відомо, сучасні системи BIOS в основному написані на С та / або збірці. Перехід до якогось іншого інструменту додав би значні витрати до товарних товарів, що може дуже негативно вплинути на продаж. Не вдаючись до Економіки 101, я можу запевнити, що ПВТ, мабуть, не варто відступати від перевірених інструментів, що були перевірені десятиліттями.

Звичайно, існують і будуть проекти для любителів писати BIOS. Вони також поки що, здається, обирають С та / або збірку. Можливо, одного дня будуть використані інші технології. Але сьогодні вибір чітко визначений.


4
Це трохи збору азоту, але C # і Java не інтерпретуються. Вони компілюються в байт-код. Це байт-код, який потім обробляється перекладачем. Не змінює логіку першого абзацу.
Тонні

1
@Tonny Це правильно. Я додав "прямо чи проміжне тлумачення", щоб бути трохи більш зрозумілим.

@Tonny звичайно джитер, а не інтерпретатор, що є важливою відмінністю, оскільки це можливо попередньо перетворити все на рідну мову, доки не використовуються певні динамічні прийоми. Як такий, теоретично можна було б написати BIOS на мовах .NET або Java, якщо один зробив це і переконався в наявності всієї необхідної підтримки для виконання. Я уявляю, що зусилля, які роблять це, могли би більше, ніж гномити будь-які зручності.
Джон Ханна

1
@Tonny Насправді C # компілює до рідного коду msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx, тому дивно бачити це у списку слабких / динамічних мов.
День

@Den C #, як правило, не компілюється у рідний код. Цей продукт .Net Native, на який ви посилаєтесь, ще офіційно не вийшов. З того, що я прочитав, він складе код програми та необхідний рамковий код у виконуваний файл. Відповідно до FAQ, це буде орієнтовано на додатки Windows Store спочатку, тому може знадобитися певний час, щоб це підтримало ширше. З урахуванням сказаного, схоже, що Microsoft може відійти від моделі віртуальної машини деякий час у майбутньому, якщо все піде добре.

4

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

Але ви, можливо, думаєте про Option ROM (які іноді називають BIOS, як у "Video BIOS" для GPU з опцією ROM)?

Для реальних ROM-сумісних опцій, сумісних з BIOS, вони, ймовірно, будуть виконавчим кодом, залежним від ISA (знову генерується будь-якою мовою, яку можна скласти для націлювання на потрібну архітектуру); PCI також дозволяє включити код для декількох ISA і дозволяє хосту вибрати відповідний бінарний образ під час завантаження.

Для сумісних з UEFI опціональних ROM є також формат байтового коду, незалежний від архітектури, який можна запускати в різних архітектурах, але ISA-залежний код також все ще може бути використаний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.