Пишем свой ROM BIOS +113



Со стародавних времён хотел попробовать создать собственный ROM BIOS, который будет записан в отдельную микросхему и будет выполнять какие-то полезные действия. Например, ROM BIOS установлен в видеокартах (по крайне мере старых), контроллерах дисков и много где ещё — это фактически расширения обычного BIOS. Понимаю, что это всё старьё и тягаться с возможностями современного UEFI бессмысленно, но мне очень хотелось создать свой собственный образ, который находится физически в отдельной микросхеме и работает при старте системы. Поэтому пришлось даже для этих целей найти старый комп.

Когда я только решил влезть в этот вопрос, столкнулся с тем, что достаточно мало толковой информации, которая была бы хорошо и чётко изложена. Возможно, я плохо искал, примеров того, как писать свою программу в бутсектор жёсткого диска было много, а вот толкового мануала по созданию BIOS Extension — кот наплакал.

В этой статье мы с вами разберём создание своего ROM BIOS, дальше я расскажу про тонкости и нюансы, напишу низкоуровневый «Hello world», сделаю настоящий интерпретатор BASIC ROM, который стартует при включении компьютера, как в первых IBM PC.

Теория работы расширения BIOS


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

Если говорить об архитектуре IBM BIOS, то он может быть расширен отдельными модулями, и всё будет работать как единый код. Поэтому в персональную ЭВМ могут быть добавлены дополнительные микросхемы ПЗУ, которые будут включать в себя эти модули.

Многие из вас видели эти микросхемы на сетевых картах, но они также присутствуют в видеокартах VGA Video BIOS, системный (основной) BIOS, BIOS IDE жёсткого диска и многие другие.

Для того чтобы системный BIOS нашёл дополнительный модуль в памяти, есть специальная процедура, которая позволяет его найти. Во время самотестирования POST, после загрузки векторов прерывания в ОЗУ, резидентный код BIOS начинает проверять ПЗУ на наличие специальных байтов заголовка, которые помечают начало дополнительного модуля BIOS. Поиск этих заголовков идёт в диапазоне абсолютных адресов 0C8000h - 0F4000h.

Заголовок имеет определённый вид:

  • Два байта обозначают начало секции: 0x55 и 0xAA.
  • Сразу за двумя первыми байтами заголовка, следует третий байт, который содержит длину дополнительного кода BIOS. Это количество блоков, длиной 512 байт, необходимых для хранения этого кода. Это ещё значит, что раздел кода расширения BIOS не может быть длиннее:

$2^{8}\cdot512=128\,КиБ$


После того как заголовок был найден, проверяется — является ли последующий раздел настоящим расширением BIOS. Для этого выполняется проверка целостности для указанного количества блоков по 512 байт. Значения каждого байта в блоке суммируются сложением по модулю 0x100 — эффект такой же, как при делении суммы всех байтов на 4096(d). Остаток 0 указывает, что расширение BIOS содержит корректный код. Проще говоря, последний байт должен хранить контрольную сумму, сумма всех предыдущих байтов, с которой даёт нуль.

Как только заголовок идентифицирован, контрольная сумма проверена, то управление будет передано к третьему байту этого расширения, и начинается выполнение программы, содержащейся в этом расширении. Например, видеокарта инициализирует свои регистры, благодаря которым вы можете видеть что-либо на мониторе после включения. Или находят диски, подключённые к компу.

Дальше, когда код был выполнен, управление вновь передаётся к резидентному BIOS, и поиск в памяти дополнительных блоков BIOS продолжается. Этот процесс завершается, когда достигается абсолютный адрес 0F4000h, после которого уже и начинается загрузка с диска.

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

Например, в большинстве систем тех лет, есть три стандартных BIOS, которые, как правило, всегда расположены в одном и том же месте:

  • Системный BIOS: основной системный BIOS расположен в блоке памяти размером 64 КБ от F0000h до FFFFFh.
  • VGA Video BIOS: это BIOS, который нужен для инициализации и управления видеокартой. Обычно он находится в блоке размером 32 КБ от C0000h до C7FFFh. Находится непосредственно на плате видеокарты.
  • BIOS жёсткого диска IDE: BIOS, который управляет жёстким диском IDE, если в вашей системе есть IDE, расположен от C8000h до CBFFFh. На старых платах расположен на плате контроллера жёстких дисков, на новой системе, как я понимаю, непосредственно на материнской плате.

Например, можно взять программу RAMVIEW, которую я правил в прошлом посте, и посмотреть BIOS видеокарты.


Просмотр памяти BIOS реальной видеокарты

Переходим по смещению C000h, что как раз соответствует физическому адресу C0000h. Можно сразу увидеть два «магических» числа заголовка: 55h и AAh, затем идёт число 7Ch, которое говорит нам, что это расширение занимает 63488 байта.

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

В общем-то, этой информации должно быть достаточно, чтобы взять и написать свой BIOS.

Пишем «Hello Wold» в расширении BIOS.


Когда начинал искать информацию по теме, наткнулся на следующую PDF, которая и стала кладезем информации. Это какая-то презентация, как собирать BIOS-расширения. В конце неё даётся ссылка на репозиторий с прекрасным примером и описанием. Это замечательный пример того, для чего можно было создавать свои расширения в BIOS — защищённая загрузка на жёсткий диск с паролем. Да, во времена UEFI всё это потеряло всякий смысл. Но мы хотим разобраться с этой частью.

Попробовал это расширение, оно у меня высыпалось с ошибкой. Но я понял, что оно работает, потому что оно запустилось и напечатало ошибку. Значит можно взять код, который выводил ошибку и сделать из него «Hello World».

Обкорнав этот пример, получилось настоящий «Привет мир». Сам ассемблеровский код разбирать не буду, он достаточно очевиден, но обращу внимание на некоторые моменты. Код весь можно посмотреть в моём репозитории. Программа собирается транслятором nasm, на мой взгляд, самый удобный и простой транслятор для начинающих, работает как в DOS, Windows, так и в Linux. Для удобства сборки написал Makefile.
Пробежимся по коду hello.asm:

org 0
rom_size_multiple_of equ 512
bits 16
    ; PCI Expansion Rom Header
    ; ------------------------
    db 0x55, 0xAA ; signature
    db rom_size/512; initialization size in 512 byte blocks
entry_point: jmp start
start:

Начинаем работать с нулевого смещения. Вначале мы определяем define rom_size_multiple_of equ 512, который содержит размер блока. Bits 16 говорит, что NASM должен генерировать код для процессора, работающего в шестнадцати битном режиме.

db 0x55, 0xAA — это заголовок, магические числа, которые обозначают начало область начала расширения BIOS.
db rom_size/512 — это один байт, который определяет размер секторов нашей программы. Рассчитывается автоматически с помощью макроса, для этого в конце программы добавлен следующий макрос:

rom_end equ $-$$
rom_size equ (((rom_end-1)/rom_size_multiple_of)+1)*rom_size_multiple_of

Макрос rom_end — получает размер программы в байтах. Далее идёт расчёт размер памяти, кратно блоку 512 байт и сохраняется в макрос rom_size. И это значение уже подставляется в байт в памяти, где рассчитывается количество блоков. Надеюсь, вы не запутались, тут просто происходит рекурсивная трансляция.

После того как заголовок определён, идёт команда jmp start, которая осуществляет прыжок на начало исполнения программы. В конце кода программы, перед макросами расчёта её размеров, резервируется 1 байт для расчёта контрольной суммы:

db 0 ; reserve at least one byte for checksum

В качестве способа ввода-вывода используется стандартное прерывание BIOS int 10h, которое расписывается в любой книжке по ассемблеру, поэтому не вижу смысла подробно на этом останавливаться. Многие студенты пишут подобные опусы на лабораторках в институте.

Самое интересное — расчёт контрольной суммы, и он осуществляется с помощью дополнительной программы addchecksum.c. Её исходники я также позаимствовал из проекта AHCI BIOS Security Extension. Код этой программы тоже стоит разобрать, потому что он интересен и полезен. Не так много работающих примеров, которые умеют считать контрольные суммы для расширения BIOS.

...
int main(int argc, char *argv[]) {
...
    FILE *f=fopen(argv[1], "r+");
...
    fseek(f, 0, SEEK_END);
    int f_size=ftell(f);
    fseek(f, 0, SEEK_SET);
    unsigned char sum=0;
    int i;
    for(i=0;i<f_size-1;i++) {
        sum+=fgetc(f);
    }
    fputc((0x100-sum)&0xff, f);
...
}

С помощью перехода в конец файла fseek(f, 0, SEEK_END); мы получаем размер файла int f_size=ftell(f);. Далее с начала файла образа читаем побайтно и суммируем полученные значения в однобайтовой переменной sum (то есть отбрасывая бит переноса). После чего инвертируем полученное значение и записываем его в последний байт нашей программы fputc((0x100-sum)&0xff, f);, где мы заранее зарезервировали нулевой байт данных. В результате, если просуммировать весь код программы, он должен быть равен нулю, вместе с нашей контрольной суммой (последний байт хранит отрицательное число контрольной суммы).

Собрать это всё можно следующими двумя командами:

gcc addchecksum.c -o addchecksum
nasm hello.asm -fbin -o hello.rom
./addchecksum hello.rom || rm hello.rom

Результатом всех операций, если вы всё сделали правильно, будет файл hello.rom. Осталось найти способ протестировать работоспособность этого бинарника.

Способы отладки BIOS Extension


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

Всё хорошее придумано для нас — это виртуальные машины, в данном случае использовал VirtualBox и qemu. Второй вариант быстрее и проще, первый — доступен в Windows, а поскольку большую часть времени работаю в wsl под Windows, для меня это актуально. Да, я знаю, что qemu есть для Windows, но таков путь.

VirtualBox


Для того чтобы протестировать ROM BIOS Extension, я создал пустую виртуальную машину. Там не требуется даже подключать жёсткий диск, он не нужен. Далее необходимо подключить данный образ к виртуальной машине. В Windows делал следующим образом, запускаю PowerShell и выполняю:

cd "C:\Program Files\Oracle\VirtualBox\"
.\VBoxManage.exe setextradata testrom "VBoxInternal/Devices/pcbios/0/Config/LanBootRom" "c:\tmp\hello.rom"



После этого можно просто подменять файл c:\tmp\hello.rom и всё будет работать. В Linux тоже всё работает, команда такая же, разве что не требуется лезть по явному пути, так как путь до VBoxManage уже содержится в переменной PATH.

Копирую файл hello.rom в c:\tmp\ и пробую запустить виртуальную машину.


Тестирование образа ROM в VirtualBox

Всё отлично работает. Но для меня qemu показалось намного удобнее и проще, без всех этих плясок с созданием машины и прописыванием путей до образа. И запустить её можно из любой папки.

Запуск BIOS в qemu


Протестировать в виртуальной машине qemu можно одной командой, прямо из папки с получившимся бинарником:

qemu-system-i386  -net none -option-rom hello.rom

  • -net none говорит, что сети у нас нет.
  • -option-rom — указывает образ ROM-файла.

Очень просто и удобно. Плюс можно сразу встроить в Makefile, чтобы собрать и проверить.


Запускаем тестирование программы из Makefile

Оба инструмента имеют право на жизнь, но мой выбор — это qemu, плюс там удобно будет ещё и посмотреть, что происходит с моей программой.

Тестирование на реальном железе


Если первая часть статьи показалась вам сложной, то нет — это была самая простая часть проекта. Самая сложная часть, которая отняла у меня большую часть времени — это запуск всего на реальном железе.

Вообще, не так много способов установить свой собственный ROM в память компьютера, самый простой – это подобрать сетевую карту, у которой есть кроватка для установки ROM. Вроде бы прошивай ПЗУ, устанавливай в кроватку и вперед, но как обычно, путь был тернист.

Попытка на 386 машине


Изначально планировал весь проект реализовать на 386 машине, железо которой мне было любезно предоставлено spiritus_sancti.


386 материнская плата

Чтобы оживить его, пришлось пройти настоящий квест по разворачиванию DOS на Compact Flash, оказалась не такая простая задачка, с танцами. О чём подробно описал у себя в ЖЖ. Все эти мытарства были нужны для того, чтобы увидеть образ ПЗУ в памяти ЭВМ.

Для прошивки взял микросхему M2764, программатор долго её не хотел видеть, всё давал ошибки ножек. Но всё же дал её прошить.


Прошивка микросхемы

После прошивки вставил её в панельку сетевой карты и стал ждать чуда.


ПЗУ M2764 в панельке сетевой карты

Но чуда не произошло, сколько я не плясал с бубном, но видел при загрузке только такую картину:


BIOS найден не был, попытка загрузиться на дискетку

Тогда я тщетно пытался разыскать свой код в памяти с помощью утилиты debug (для этого и ставил DOS). Но безуспешно, в результате решил взять железо посвежее для своих опытов.

Pentium 4 и сетевая карта Realtek RTL8139


Поскребя по сусекам в своём гараже, обнаружил там системный блок с Pentium 4, который долгое время стоял под дождём, но оказался живым. И подумал, что он вполне может подойти для моих целей. Винт был мёртв и хрустел французской булкой, но меня это не волновало, главное, чтобы работал BIOS и PCI.


Потрошка подопытного, все шлейфы отключены, во избежание

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


Старт, всё живое, дисков нет

Чтобы код с сетевой карты выполнился, необходимо обязательно указать загрузку с LAN. Как это ни странно, по умолчанию выполняться он не будет, хотя мануалы гласят об обратном.


Включаем исполнение кода на сетевой карте

Есть верный способ сделать что-то хорошо — это повторить за кем-то. Поэтому, решил взять не только куски кода из проекта AHCI BIOS, но и рекомендации по выбору сетевой карты:
This one uses the Realtek RTL8139 controller, which is my recommendation. Network cards with the RTL8139 are easy and cheap to find on the second hand market. The network card should come with an unpopulated DIP-28 socket, so you will also need to get a DIP-28 EEPROM as the actual option ROM. Any ROM that sells as 28C64 should be compatible.
Вместо 28C64 решил использовать микросхему M2764, которая у меня уже была в наличии. Карта очень распространённая и купить её не проблема, главное следить, чтобы в ней была панелька.

Как я узнал из статьи "Boot manager для 486-го компьютера", для работы BOOT ROM сетевую карту нужно конфигурировать. Нашёл с трудом драйвера для RTL8139 под ДОС и даже настроил, чтобы всё корректно работало.


Настройка сетевой карты в драйверах

Ставлю прошитое ранее ПЗУ в эту сетевую карту, ииии…


Установленное ПЗУ. Железка снята для удобства многократной установки платы

Устанавливаю её в системный блок, загружаюсь и ничего. Как я не бился, как ни крутился, что не делал — не получается. Именно тогда я озадачился поиском программы просмотра памяти. С помощью RAMVEW смотрел всю память, но так и не встретил там участка с моим образом (ключевое слово «Hello Word» в начале сегмента).

Стало понятно, что нужно брать сетевую карту, у которой уже есть настоящий, живой Boot ROM и смотреть как же он работает. Это сетевые карты типа PXE.

Рабочий вариант: сетевуха с образом PXE


Идея простая, найти сетевую карту с рабочим ПЗУ, затем посмотреть, как оно устроено. Отпаять с неё микросхему ПЗУ, зашить свою прошивку и припаять обратно. Но потом я подумал: а зачем отпаивать, если можно поставить просто панельку. Так я и поступил.

PXE-сетевые карты стоят на досках объявлений дешевле, чем микросхемы ПЗУ в магазине. Поэтому, купил сразу несколько плат, чтобы было место для экспериментов. Выбор пал на распространённую модель: 3Com 3C905C-TXM.


Сетевая карта с PXE

Ставлю её в компьютер, и, о чудо, она грузится!


PXE ROM успешно обнаружен!

Можно даже посмотреть, как выглядит образ PXE ROM в памяти компьютера, с помощью утилиты RAMVIEW.


Образ PXE ROM в памяти компьютера

Здесь для меня была ценная информация, где я смогу найти образ своей программы в памяти компьютера. Всё точно так же, магические два числа и размер образа в секторах.

Дело стало за малым: отпаять микросхему и припаять панельку. На деле оказалась не такая простая процедура, как я думал, даже пришлось носить к профессиональному монтажнику (благо есть такая возможность), но у меня всё получилось.


Снимаем микросхему ПЗУ


Монтируем панель для микросхем


Прошиваем

Устанавливаем микросхему на своё законное место. Для сравнения плата с панелькой и микросхемой, запаянной штатно:



Всё, теперь всё готово к тестированию. Вставляем плату в компьютер, и всё работает!


Суровый аппаратный Hello World

Этот удивительный момент даже заснял на видео.

Теперь даже можно проверить, что в памяти видно эту программу. Обратите внимание на строку «Hello world.» в конце.


По адресу PXE теперь живёт «Привет мир»

Всё это конечно прикольно, но хочется чего-то более полезного и функционального, ведь умение делать свой ROM BIOS дарит много новых возможностей. А давайте сделаем настоящий ROM BASIC?

BIOS ROM BASIC


Старожилы помнят, что в первых персональных компьютерах IBM интерпретатор BASIC был встроен в ROM BIOS. И мне показалась забавной загружаться вместо ОС в интерпретатор BASIC.

Главная задача, которая стояла предо мной — это найти хорошие исходники BASIC, написанные на ассемблере. Может показаться забавным, но Microsoft официально, в своём репозитории выложила исходники GW-BASIC. Однако, внимательно посмотрел на них, почитал статьи тех, кто пытался их собрать, например, и понял, что дело гиблое. В результате я отказался от идеи использовать этот исходник, хотя, конечно, это было бы очень аутентично.

Мне же посоветовали исходники bootBASIC, который занимает всего 512 байт, и рассчитан для работы в загрузочном секторе жёсткого диска. По счастливому стечению обстоятельств, в качестве транслятора там тоже использовался nasm.

Я сделал клон этого проекта, за пару часов добавил функционал, чтобы он компилировал ещё образ для ROM сетевой карты: добавил в начале магическое число, размер и в конце контрольную сумму — теперь вы всё знаете и сами умеете.

Осталось только собрать образ ROM простой командой:

make basic.rom

И проверить его:

make runqemurom

Но всё это не спортивно, интересно попробовать в реальном железе. И таки да, оно работает!



Как говорится, лучше один раз увидеть, чем тысячу раз прочитать. Поэтому вот вам небольшое кинцо.


Заключение




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

Очень много этапов экспериментов не вошло в статью, как минимум у меня около десятка различных вариаций «Hello world», написанных в разной стилистике ассемблера. Поле для экспериментов просто непаханое. Несмотря на то, что это старьё, такой опыт полезен для разработки на голом железе и может быть использован при программировании других модулей.

Хоть литературы по теме немного, создавать свой ПЗУ BIOS совершенно несложно. Это не сильно отличается от примеров создания загрузчика в бутсектор жёсткого диска. Просто нужно помнить, что есть ещё контрольная сумма, которую тоже нужно уметь считать и записывать в конец образа ROM.

Полезные ссылки


  1. Краткое описание что такое BIOS Extension.
  2. Презентация, которая сдвинула меня с мёртвой точки.
  3. Репозиторий проекта AHCI BIOS Security Extension.
  4. Мой репозиторий BIOS «Hello world.».
  5. Оригинальный репозиторий bootBASIC.
  6. Мой репозиторий, который умеет грузиться в ROM BIOS.
  7. Интересная статья по теме "Boot manager для 486-го компьютера".

P.S. Если вам интересно моё творчество, вы можете следить за мной ещё в телеграмме.




Комментарии (57):

  1. VBKesha
    /#24944750 / +9

    Есть ещё один вариант использования bootrom на старых системах(ну где-то до 4 пня включительно работает). Зашить его как часть биоса, для Award можно было сделать через утилиту CBROM.
    Сам так добавлял бутром для сетевух без онного, с целью получить PXE.

  2. BiosUefi
    /#24944804 / +7

    //Чтобы код с сетевой карты выполнился, необходимо

    ROM состоит из двух частей, инициализирующей железяку, которая выполняется не из С000-Е000, и рабочая часть, та которую загружают в С000-Е000, и на которую переходят в момент загрузки ОС/PXE/Basic

    • dlinyj
      /#24944856 / +6

      А где об этом прочитать? И как это мапится в памяти?

      • Arioch
        /#24947538 / +10

        Ну например в описании выхода из Protected Mode в Real Mode, которая выполняется на 80286 процессоре только перезагрузкой. Более менее подробное описание как писать такие программы содержит и описание куда именон выпадает процессор после перезагрузки (по-моему это F000:FFF0, но может быть и какой-нибудь FFF0:00F0 - не помню). Там же рядышком записана текстом дата BIOS'а и тип компьютера (сегодня они все IBM PC AT 286, но до него было много вариантов).

        Классической бумажной книгой тогда был Джордейн и после него Нортон.
        https://infopedia.su/17xe20a.html
        http://lib.ru/TECHBOOKS/JURDAIN/jourdain.txt
        Но там это самым краешком, как и в TechHELP!

        ------------------

        А вообще вам надо на Интеле или на bitsavers или на wikichip поискать технические описание процессоров 80286 и 80386 и именно с прицелом на состояние процессора после включения/reset'a (system initializaiton sequence). На старых компьютерах это ещё относительно просто было.

        Яндекс на "80386 initialization code" выдает много интеловских книг на разных сайтах.
        Вот пример перевода - https://qsetup.ru/initsializatsiya-protsessora-chto-eto/

        Вот пример такой официальной доки на относительно современные ПеньПро - смотри, в самом ли деле такое интересно? Я что-то сомневаюсь: http://datasheets.chipdb.org/Intel/x86/Pentium Pro/PPPBIOS.PDF

        Вот тут в описании куча книг: https://www.youtube.com/watch?v=7yb62vgtu7o

        Тут можешь порыться https://wiki.osdev.org/System_Initialization_(x86)

        Если не ошибаюсь, при вскрытии внутренних кодов процессоров VIA использовали самописный спец-BIOS, но это не точно, это смутно помнится, потому что несмотря на вопля жёлтой прессы про бэкдор - ничего интересного там не нашли.

        All in all, это только издалека глядеть интересно, а в конкретной материнке придется нудно перебирать предписанные изготовителями микросхем последовательности их первичной настройки, зная что на другой материнке хорошо если пловина от этого понадобится, а то и 90% в мусор :-)

        ------------------

        В проектах SeaBIOS/Coreboot/Libreboot наверное много документации есть под более-менее современные процессоры.

        -----------------

        "Controlling the Bootstrap Process Firmware Alternatives for an x86 Embedded Platform" такая штука гуглится. http://uu.diva-portal.org/smash/get/diva2:469328/FULLTEXT01.pdf

        Доки по Intel MCS-86 и Intel MCS-51 можно поискать, например см. chapter 10 у https://archive.org/details/Intel-iAPX286OperatingSystemsWritersGuide1983OCR

        Но, такие доки низкоуровневые очень привязаны к конкретной модели процессора (надеюсь хоть у разных степпингов одной модели не отличаются)

        Вообще, выше мной по памяти названный адрес F000:FFF0 - это уже после инициализации DOS-режима. ЕМНИП сразу после ресета BIOS отображается на самый-самый конец физического адресного пространства, и процессор находится в очень специфическом режиме, почти real, но не совсем (кэши селекторов другие как после LOADALL). И ещё надо успеть "переотразить" BIOS на конец 1-го мегабайта вместо RAM, либо скопировать его туда (обычно это, потому что RAM быстрее ПЗУ), и только потом делать "нормальные" сегменты.

        https://www.intel-vintage.info/inteldevelopmenttools.htm - это большей частью музей макулаторы, но вот например в 486SX - Intel Processor Evaluation Board Manual есть любопытная схема Figure 3-3. Boot Block Flash Memory Selection и пара страниц текста перед ней. Но в целом думаю, что ты там скорее закопаешься, чем что-то полезное найдёшь. Выпадешь в какой-нибудь не-86 процессор (например MCS-96, 80286, ISIS в одной из не-86 веток. Вообще, много чего не-86 у интелей было) и понеслась :-)

        ----

        про XT-CF - ну а что же это может быть ещё? :-D

        CompactFlash - Это и есть IDE-диск, только на иголках вместо шлейфа и молекса :-)
        Самые первые SSD, когда еще такого термина не было :-D
        И даже не всегда SSD - см. IBM MicroDrive :-S

        • Rigidus
          /#24947736 / +3

          Тот случай, когда комментарий звучит как трейлер для статьи. Про CompactFlash и его использование в DIY-компьютерах в стиле старых машин (и их инициализацию) я бы с удовольствием почитал!

          • serge-sb
            /#24949440 / +1

            Добавлю: я бы ещё с удовольствием почитал про то, как заставить работать CF в UDMA режиме. Когда-то, ещё до того, как поставил нативный IDE SSD в ThinkPad 600X, пробовал запихивать туда CF через переходник. PIO работал, но, разумеется, дико медленно и с полной загрузкой процессора. Либо CF-карта не поддерживала, либо что-то в переходнике не получалось. Вот этот момент очень интересно узнать.

        • dlinyj
          /#24949676

          В целом было достаточно понять, что в реальном режиме и располагается в старших адресах. Но я сомневаюсь что так делали, потому что места мало, и проще всё в реальном режиме делать, а по нужде мапить области памяти переключая банки.

      • BiosUefi
        /#24950324 / +1

        Шины PCI, PCI Express. Архитектура, дизайн, принципы функционирования. Автор Сергей В. Петров Глава 11 ПЗУ расширения

        Лучи добра, создателям "кармы".

        • dlinyj
          /#24950348

          Спасибо за книгу, не знал о ней.

          Лучи добра, создателям «кармы».

          Да, в действительности, спасибо большое. Очень удачно отсеивает токсиков и неадекватов.

  3. kulhaker478
    /#24944828 / +7

    Спасибо за статью, как обычно стабильное гик-порно.

    В качестве альтернативы различным сетёвкам, могу посоветовать попробовать с платкой XT-CF Lite. Собирается на старой доброй 74 логике, правда для неё нужна машина старее 423 сокета, то бишь с ISA. Бонусом получается одна плата под CFки, без всяких длинных шлейфов и мультикарт.

    Фотографии это прелести за авторством Макса Крюкова + его версия платы:

    • dlinyj
      /#24944860 / +5

      А разве это не обычный IDE контроллер? На плате вон, прям на фото, есть такой же ROM BIOS.

      UPD. Я понял вашу идею. Ну мне проще купить на досках сетевуху, чем паять новое.

  4. Eltaron
    /#24944832 / +7

    Кстати, такие панельки для PLCC легко запаять и без монтажника, если выломать дно и паять паяльником изнутри. Потом дно можно вернуть, посадив на каплю термосоплей.

    • dlinyj
      /#24944878 / +1

      Спасибо за идею, буду знать.

  5. roboter
    /#24944970 / +1

    Я так понимаю БИОС на сетевухах нужен чтобы запустить ОС по сети.
    Удалось проделать подобный фокус?

    • dlinyj
      /#24945114 / +4

      Этот фокус проделывал сотни раз при отладке встраиваемых систем. Только на ARM, MIPS и прочих архитектурах. Нужно поднять tftp сервер для этих целей. Ничего сложного, документации валом. Гуглите pxe tftp.

    • mapnik
      /#24946562 / +1

      Пока не было всяких Pi, маленькие бездисковые машинки (например, принт-серверы в сети организации) делались таким образом на ура.

  6. VelocidadAbsurda
    /#24944978 / +3

    Помнится, для сетевых карт на Realtek была какая-то утилита настроек, в которой, ЕМНИП, была и настройка начального адреса ROM (карта то безджамперная). Возможно, по умолчанию там выкл.

    В студенческие времена использовал сетевую карту в качестве «только чтение» программатора 27Схх.

  7. zatim
    /#24944986 / +2

    Хочу дать идею для следующей статьи - сделать ROM DOS. DOS, который грузится из ПЗУ для совсем ретро машин. Один любитель из Чехословакии сделал что то подобное, но у меня так и не получилось его запустить на Электронике 1502.

    • Compiller
      /#24945224 / +1

      в нынешних условиях лучше зашить ROM модуль для запуска с NVME ssd, воткнутого в pci-e через переходник за пару баксов.

      на сайте DNS-SHOP есть статейки про внеднение такого модуля

      также на ixbt и wims-bios

      • dlinyj
        /#24945282 / +1

        Любопытно, а в чем смысл?

        • bvbr
          /#24946058 / +1

          Старые платы/биосы неумеют грузится с nvme, поэтому как минимум загрузчик приходится оставлять на sata hdd/ssd

          емнип распостранненый вариант: модуль поддержки nvme из биоса матплаты на чипсете z97 подсаживается в биос матплаты на чипсете z77 / z87 , после этого эти платы обретают возможность грузится сразу с nvme, подключенного в pcie через переходник




      • zatim
        /#24945326 / +1

        Может быть и лучше) но у ретро компов нет pci-e.

        PS. Спасибо за ссылку на ROMOS, начал ее усиленно гуглить, но не нашел.

    • axe_chita
      /#24950204 / +1

      В репозитории FreeDOS есть и Package romdsk и Package romos
      Кстати, с ROM DOS вы наверняка сталкивались при посещении боулинга. Именно под его управлением, работает та часть что общается с игроками. :)

  8. Compiller
    /#24945186 / +1

    на ixbt в форуме товарищ вшивал в VIA 6421 RAID софт для работы с HDD

    ещё был проект RomOS (в биос материнки вшивали DOS)

    биостар вшивала в материнки MemTest в виде ROM модуля

    • dartraiden
      /#24952938

      MemTest

      На топовых материнках асус его до сих пор вшивает, но уже, конечно, в виде EFI-приложения.

  9. MaFrance351
    /#24945300 / +4

    Отличная статья. В своё время тоже интересовался подобным, но, увы, не вышло.

    Вот ссылка в тему: https://www.radiokot.ru/circuit/digital/pcmod/09/

    Тут в деталях и с использованием так нами любимого старого железа описано, как собрать плату на ISA и как запустить это расширение BIOS.

    • dlinyj
      /#24945846 / +1

      Ух какая прелесть, спасибо за классную ссылку!

  10. steanlab
    /#24945798 / +1

    Круть, спасибо! Тоже как-то по нужде экспериментировал с PXE и пришлось мешок сетевух перебрать.

    • dlinyj
      /#24945848

      Да, оно вроде всё просто, но не просто.

  11. tormozedison
    /#24946044 / +2

    Это было на КУВТах на 286 - да, существовали и такие чудеса, в 1993 году примерно. В сетевой карте стояло ПЗУ с неким "Novell NetWare remote program loader". DOS и всё остальное грузилось по коаксиальному кабелю с "сервера" - тоже на 286, но с жёстким диском. При отключении питания "сервера" остальные машины превращались в "гробы".

  12. osmanpasha
    /#24946632 / +2

    Автору спасибо за статью, но больше всего меня поразило, что в 512Б можно втиснуть интерпретатор Бейсика.

    • tormozedison
      /#24946766 / +1

      Вот это реально интересно, самый миниатюрный из Бейсиков, что доводилось встречать - 768 байт. Спасибо за наводку, буду знать, что есть и 512.

      А GW-BASIC умельцам уже удалось скомпилировать, существует репозиторий.

      • dlinyj
        /#24946790

        Да, удалось, мне в личку написали и дали ссылку на репозиторий. Но всё равно, не всё гладко. И для моих целей он не подходит.

        • tormozedison
          /#24946868

          Для ваших - да, не подходит, он довольно крупный, 50 килобайт почти А жаль, разработчики "Радио-86РК" не подозревали о самой возможности написать 512-байтный Бейсик. Знали бы - написали бы обязательно, и в 2-килобайтное ПЗУ втиснули, возможно, чуть уменьшив МОНИТОР, если бы понадобилось.

          А не знаете, как сделать загрузочную флешку с Boot Basic? Там есть img-файл, загнать на флешку утилитой dd, как это обычно делают - получится?

          • dlinyj
            /#24946894

            Дело не в размере (у меня 64 кБ). А в в том, что там используются функции ДОС.

            По идее да, должно работать.

            • tormozedison
              /#24946904 / +1

              Там ещё вот что выяснилось, в Boot Basic нету FOR и NEXT, но IF и GOTO прекрасно их заменяют, такой минимализм мне по нраву.

              А когда-то я недоумевал, зачем нужны такие языки программирования, как, например, яблочный Integer Basic, работающий только с целыми числами, хотя любой калькулятор может работать с дробными. Или язык BAT-файлов, позволяющий делать профессиональные, просто зубодробительные многоуровневые меню, и имеющий много других полезных функций, но не работающий с числами вообще. А потом узнал про HTML, ещё тот, который без Javascript, тоже функций дофига, а с числами не работает. И ещё позже - про Ladder, тоже с числами не работающий, но в тех задачах, для решения которых он предназначен, равных по удобству не имеющий. И понял, что "задачеориентированные" языки тоже могут полезными быть.

              • Vegas_Real
                /#24950010 / +1

                В BAT-файлах есть переменные, он с ними работает и все считает, потом можно и результат на экран вывести.

                Но пока напишешь там нормальное многоуровневое меню мозг сломаешь. А на обычном, не "задачеориентированном" языке это намного проще делается.

                • tormozedison
                  /#24950410

                  Choice (внешний исполняемый файл, если склероз не изменяет) и переменная errorlevel. И меню - легко. Можно, кстати, и такой внешний исполняемый файл сделать, чтобы ему подсовывать математическое выражение, а он результат в errorlevel возвращал. Но почему-то никто не делал.

            • eugeny54
              /#24949936 / +1

              Тут (https://www.pcjs.org/machines/pcx86/ibm/5160/rom/) пишут про 8кб IBM ROM BASIC, правда это было только для некоторых моделей IBM PC XT. По ссылке есть прошивки, но нет уверенности, что они будут работать в отвязке от оригинального BIOS-а.

              • dlinyj
                /#24950106

                Да, я видел это. Проверить несложно, главное конвертнуть json в бинарный формат и настроить базовый адрес ROM

              • dlinyj
                /#24950126

                Хотя скорее всего не выйдет, без исходников.

                image

  13. VT100
    /#24947094 / +1

    Не помню подробностей таких древностей (какого объёма были ПЗУ — не 27256 ли минимум?), но осмелюсь предположить, что начальная неработоспособность могла быть вызвана применением излишне мелкой 2764. У неё на месте входа 15 разряда адреса (вывод 27) — вход !P cтроба записи. Попробуйте заизолировать 27 контакт панельки.

  14. 8street
    /#24948124 / +1

    Интересно, я всегда думал, что прерывания int xx — это привелегия какой-нибудь ОС и без нее не будет работать. Ан, нет.

    • dlinyj
      /#24950166 / +1

      А как же прерывания BIOS?