Wyse S10
Полтора года назад у моего друга был день рождения.
Просто собрать обычный компьютер — не интересно.
Сначала я рассматривал варианты с каким-нибудь ARM-планшетом
Затем я вспомнил про тонкие клиенты.
Wyse S10 построен на базе процессора (теперь уже) AMD Geode GX500.
Таймер, контроллер прерываний, часы
реального времени, DMA-контроллер, контроллер клавиатуры и прочие, типичные
для IBM PC AT-совместимой машины контроллеры
SMM впервые появился в Intel 386SL
Даже текстовый видеорежим отсутствует у этой машины в привычном исполнении
Поскольку программатора с соответствующей кроваткой у меня не было, я решил
попробовать прошиться внутрисхемно
https://www.parkytowers.me.uk/thin/wyse/s10/
Дело в том, что инструкция по использованию flashrom предлагала перепрошивать
не сам BIOS (который занимает 256 килобайт, восьмую часть флеш-микросхемы), а
раздел, в котором хранится Wyse ThinOS (WTOS)
К счастью, разгадка этой проблемы находилась в самом сообщение об ошибке:
Found chipset "AMD CS5536". Enabling flash write...
Error while opening /dev/cpu/0/msr: No such file or directory
Did you run 'modprobe msr'?
FAILED!
Я прошил coreboot, перезагрузил устройство и, конечно же,
увидел чёрный экран.
Во время конфигурации coreboot я включил отладочную консоль на
последовательном порту.
я заметил, что PCI-идентификатор устройства (device
id) "видеокарты" отличается от того, что показывал Tiny Core Linux в lspci с
оригинальным BIOS.
у Wyse S10 микросхема флеш-памяти отображается
в конец адресного пространства
Структура модулей у BIOS Wyse S10 оказалась необычной — с ними не захотели
работать распаковщики от биосов AWARD и AMI. К счастью, структура оказалась
достаточно простой, чтобы её можно было разобрать без особого труда:
char name[4]; /* '$' and a 3-character code */
uint8_t format; /* 3 is compressed, 4 is raw */
uint32_t load_address;
uint32_t unpacked_size;
uint32_t packed_size; /* including this 32-byte header */
char pad[15];
Если в поле format написано число 3, то модуль сжат упаковщиком JCALG1
В первом непустом модуле как раз находится VSA.
Я стал искать в интернете образы биоса от похожих машин, чтобы сравнить их
между собой.
внедрить DOS прямо в
оригинальную прошивку
решения, позволяющие запустить DOS из ROM.
проект RomOS[4], который эмулировал загрузочный диск
http://rayer.g6.cz/romos/romose.htm
Я стал писать свой эмулятор диска.
Для восстановления прошивки я использовал метод "hot swap"
00000260 55 aa 01 eb 4f 00 00 6b 6d 65 61 77 00 5e b3 08 |U...O..kmeaw.^..|
00000270 6a 00 fe cb 75 fa 56 c3 1c 00 34 00 50 43 49 52 |j...u.V...4.PCIR|
Когда мне не удалось отладить мой эмулятор, то я решил сменить направление —
раз уж я всё равно заменяю WTOS на образ дискеты, почему бы не воспользоваться
уже готовым механизмом для загрузки WTOS, и не внедрить туда свой код.
Образ WTOS начинается с трёх байт кода: cli; jmp start. Затем идёт заголовок,
у которого есть всего одно поле, которое читает оригинальная прошивка -
размер. Для запуска WTOS, прошивка копирует WTOS в первый мегабайт памяти,
настраивает таблицу GDT, включает защищённый 32-битный режим процессора,
а затем передаёт образу управление, начиная указанной выше с пары инструкций.
в реальном режиме
доступно около 1 мегабайта памяти, и физический адрес получается из двух
16-битных регистров — сегментного и смещения
В защищённом режиме всё гораздо сложнее.
Но мой эмулятор был написан для реального режима
Эмулятор перехватывает int13h, сервис BIOS для работы с дисками.
00000198 81C60093 add si,0x9300
0000019C 56 push si
0000019D 52 push dx
0000019E 6AFF push byte -0x1
000001A0 E86AFE call 0xd
000001A3 89E6 mov si,sp
000001A5 06 push es
000001A6 16 push ss
000001A7 07 pop es
000001A8 B487 mov ah,0x87
000001AA CD15 int 0x15
В случае попытки чтения, эмулятор готовит на стеке GDT, переключается в
защищённый режим, копирует запрошенные сектора из флеш-памяти и нижнюю память,
а затем переключается обратно в реальный режим.
С "дискеты" загружается драйвер RAM-диска, на него копируется
содержимое дискеты, затем эмулятор завершает свою работу (дискете делается
eject).
На RAM-диск распаковывается архив с программами — пакетный драйвер
сетевой карты, TCP/IP-стек mTCP и оболочка DOS Navigator. Затем по сети
скачивается меню со списком игр и запускается оболочка, которая сразу же это
меню и показывает.
Alt-X (выход), Enter (подтверждение выхода), путь к файлу start.bat и снова
клавиша (Enter). start.bat запускает игру, а затем запускает оболочку обратно,
и пользователь снова видит меню.
Так получается без какой-либо эмуляции процессора, почти нативно, запускать
старые игры, которые (вместе с каталогом) находятся на удалённом сервере.
На сервере dos.kmeaw.com работает обычный nginx, а меню обновляется шелл-скриптом.
Из пока что нерешённых проблем:
не работает звук; мне не удалось найти работающую реализацию эмулятора SB16
в VSM, но судя по рекламным материалам, он существует;