Установка эмулятора x86 компьютера PC AT




Здравствуйте, уважаемые читатели! Настало время установить эмулятор компьютера IBM PC AT!

Микропроцессоры х86 появились на свет в июле 1978 года с выпуском микросхемы 16-битного микропроцессора i8086, ставшей родоначальницей целого семейства микропроцессоров, ныне распространившегося на подавляющее большинство персональных компьютеров. Первый экспериментальный 32-битный однокристальный микропроцессор ARM2 увидел свет только в апреле 1986 года, незадолго до появления 32-битного i80386. Процессоры представляют собой различные архитектуры по набору команд - х86 это процессор с полным (CISC) набором команд, а ARM - с упрощённым (RISC), но с выполнением большей части команд за один такт. В итоге х86 повсеместно распространился на персональные компьютеры, где важна производительность, а ARM - на портативные устройства, где важна экономичность.

В итоге, ARM заметно проигрывает х86 по производительности. Например, ядро ARM1176, работающее на частоте 324 МГц по производительности примерно соответствует процессору Pentium 133-166 МГц - проигрыш в производительности примерно в 2 - 2,5 раза. Эмуляция даже на одинаковых архитектурах с применением технологии виртуализации на деле давала примерно четверть от исходной производительности процессора. Итак, с учётом вышеперечисленных моментов я могу сказать, что производительность эмулируемого х86 процессора на архитектуре ARM1176 заведомо не превысит 10% тактовой частоты, то есть точно не быстрее 80386, работающего на частоте 33 МГц. С учётом эмуляции периферии, производительность будет ещё ниже.

Для проверки моих оценочных расчётов нужно будет установить эмулятор QEMU, экспериментально показавший наибольшую производительность:

root@shade:~# apt-get install qemu-system-i386

Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'qemu-system-x86' instead of 'qemu-system-i386'
The following extra packages will be installed:
  ipxe-qemu libaio1 libbluetooth3 libboost-atomic1.55.0 libboost-system1.55.0
  libboost-thread1.55.0 libbrlapi0.6 libfdt1 libiscsi2 libnss3 librados2
  librbd1 libusbredirparser1 libvdeplug2 qemu-system-common seabios
Suggested packages:
  samba vde2 sgabios ovmf
Recommended packages:
  qemu-utils
The following NEW packages will be installed:
  ipxe-qemu libaio1 libbluetooth3 libboost-atomic1.55.0 libboost-system1.55.0
  libboost-thread1.55.0 libbrlapi0.6 libfdt1 libiscsi2 libnss3 librados2
  librbd1 libusbredirparser1 libvdeplug2 qemu-system-common qemu-system-x86
  seabios
0 upgraded, 17 newly installed, 0 to remove and 56 not upgraded.
Need to get 5385 kB of archives.
After this operation, 22.1 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.raspbian.org/raspbian/ jessie/main libaio1 armhf 0.3.110-1 [9228 B]
Get:2 http://archive.raspbian.org/raspbian/ jessie/main libbluetooth3 armhf 5.23-2+deb8u1 [78.8 kB]
Get:3 http://archive.raspbian.org/raspbian/ jessie/main libboost-atomic1.55.0 armhf 1.55.0+dfsg-3 [28.6 kB]
Get:4 http://archive.raspbian.org/raspbian/ jessie/main libboost-system1.55.0 armhf 1.55.0+dfsg-3 [29.9 kB]
Get:5 http://archive.raspbian.org/raspbian/ jessie/main libboost-thread1.55.0 armhf 1.55.0+dfsg-3 [47.9 kB]
Get:6 http://archive.raspbian.org/raspbian/ jessie/main libiscsi2 armhf 1.12.0-2 [42.8 kB]
Get:7 http://archive.raspbian.org/raspbian/ jessie/main libnss3 armhf 2:3.26-1+debu8u4 [951 kB]
Get:8 http://archive.raspbian.org/raspbian/ jessie/main librados2 armhf 0.80.7-2+deb8u2 [1376 kB]
Get:9 http://archive.raspbian.org/raspbian/ jessie/main librbd1 armhf 0.80.7-2+deb8u2 [315 kB]
Get:10 http://archive.raspbian.org/raspbian/ jessie/main qemu-system-common armhf 1:2.1+dfsg-12+deb8u11 [283 kB]
Get:11 http://archive.raspbian.org/raspbian/ jessie/main libbrlapi0.6 armhf 5.2~20141018-5 [78.4 kB]
Get:12 http://archive.raspbian.org/raspbian/ jessie/main libfdt1 armhf 1.4.0+dfsg-1 [13.2 kB]
Get:13 http://archive.raspbian.org/raspbian/ jessie/main ipxe-qemu all 1.0.0+git-20141004.86285d1-1 [442 kB]
Get:14 http://archive.raspbian.org/raspbian/ jessie/main libusbredirparser1 armhf 0.7-1 [14.3 kB]
Get:15 http://archive.raspbian.org/raspbian/ jessie/main libvdeplug2 armhf 2.3.2+r586-1 [21.6 kB]
Get:16 http://archive.raspbian.org/raspbian/ jessie/main seabios all 1.7.5-1 [112 kB]
Get:17 http://archive.raspbian.org/raspbian/ jessie/main qemu-system-x86 armhf 1:2.1+dfsg-12+deb8u11 [1541 kB]
Fetched 5385 kB in 15s (343 kB/s)
Selecting previously unselected package libaio1:armhf.
(Reading database ... 39260 files and directories currently installed.)
Preparing to unpack .../libaio1_0.3.110-1_armhf.deb ...
Unpacking libaio1:armhf (0.3.110-1) ...
Selecting previously unselected package libbluetooth3:armhf.
Preparing to unpack .../libbluetooth3_5.23-2+deb8u1_armhf.deb ...
Unpacking libbluetooth3:armhf (5.23-2+deb8u1) ...
Selecting previously unselected package libboost-atomic1.55.0:armhf.
Preparing to unpack .../libboost-atomic1.55.0_1.55.0+dfsg-3_armhf.deb ...
Unpacking libboost-atomic1.55.0:armhf (1.55.0+dfsg-3) ...
Selecting previously unselected package libboost-system1.55.0:armhf.
Preparing to unpack .../libboost-system1.55.0_1.55.0+dfsg-3_armhf.deb ...
Unpacking libboost-system1.55.0:armhf (1.55.0+dfsg-3) ...
Selecting previously unselected package libboost-thread1.55.0:armhf.
Preparing to unpack .../libboost-thread1.55.0_1.55.0+dfsg-3_armhf.deb ...
Unpacking libboost-thread1.55.0:armhf (1.55.0+dfsg-3) ...
Selecting previously unselected package libiscsi2:armhf.
Preparing to unpack .../libiscsi2_1.12.0-2_armhf.deb ...
Unpacking libiscsi2:armhf (1.12.0-2) ...
Selecting previously unselected package libnss3:armhf.
Preparing to unpack .../libnss3_2%3a3.26-1+debu8u4_armhf.deb ...
Unpacking libnss3:armhf (2:3.26-1+debu8u4) ...
Selecting previously unselected package librados2.
Preparing to unpack .../librados2_0.80.7-2+deb8u2_armhf.deb ...
Unpacking librados2 (0.80.7-2+deb8u2) ...
Selecting previously unselected package librbd1.
Preparing to unpack .../librbd1_0.80.7-2+deb8u2_armhf.deb ...
Unpacking librbd1 (0.80.7-2+deb8u2) ...
Selecting previously unselected package qemu-system-common.
Preparing to unpack .../qemu-system-common_1%3a2.1+dfsg-12+deb8u11_armhf.deb ...
Unpacking qemu-system-common (1:2.1+dfsg-12+deb8u11) ...
Selecting previously unselected package libbrlapi0.6:armhf.
Preparing to unpack .../libbrlapi0.6_5.2~20141018-5_armhf.deb ...
Unpacking libbrlapi0.6:armhf (5.2~20141018-5) ...
Selecting previously unselected package libfdt1:armhf.
Preparing to unpack .../libfdt1_1.4.0+dfsg-1_armhf.deb ...
Unpacking libfdt1:armhf (1.4.0+dfsg-1) ...
Selecting previously unselected package ipxe-qemu.
Preparing to unpack .../ipxe-qemu_1.0.0+git-20141004.86285d1-1_all.deb ...
Unpacking ipxe-qemu (1.0.0+git-20141004.86285d1-1) ...
Selecting previously unselected package libusbredirparser1:armhf.
Preparing to unpack .../libusbredirparser1_0.7-1_armhf.deb ...
Unpacking libusbredirparser1:armhf (0.7-1) ...
Selecting previously unselected package libvdeplug2.
Preparing to unpack .../libvdeplug2_2.3.2+r586-1_armhf.deb ...
Unpacking libvdeplug2 (2.3.2+r586-1) ...
Selecting previously unselected package seabios.
Preparing to unpack .../seabios_1.7.5-1_all.deb ...
Unpacking seabios (1.7.5-1) ...
Selecting previously unselected package qemu-system-x86.
Preparing to unpack .../qemu-system-x86_1%3a2.1+dfsg-12+deb8u11_armhf.deb ...
Unpacking qemu-system-x86 (1:2.1+dfsg-12+deb8u11) ...
Setting up libaio1:armhf (0.3.110-1) ...
Setting up libbluetooth3:armhf (5.23-2+deb8u1) ...
Setting up libboost-atomic1.55.0:armhf (1.55.0+dfsg-3) ...
Setting up libboost-system1.55.0:armhf (1.55.0+dfsg-3) ...
Setting up libboost-thread1.55.0:armhf (1.55.0+dfsg-3) ...
Setting up libiscsi2:armhf (1.12.0-2) ...
Setting up libnss3:armhf (2:3.26-1+debu8u4) ...
Setting up librados2 (0.80.7-2+deb8u2) ...
Setting up librbd1 (0.80.7-2+deb8u2) ...
Setting up qemu-system-common (1:2.1+dfsg-12+deb8u11) ...
Setting up libbrlapi0.6:armhf (5.2~20141018-5) ...
Setting up libfdt1:armhf (1.4.0+dfsg-1) ...
Setting up ipxe-qemu (1.0.0+git-20141004.86285d1-1) ...
Setting up libusbredirparser1:armhf (0.7-1) ...
Setting up libvdeplug2 (2.3.2+r586-1) ...
Setting up seabios (1.7.5-1) ...
Setting up qemu-system-x86 (1:2.1+dfsg-12+deb8u11) ...
Processing triggers for libc-bin (2.19-18+deb8u10) ...

Свернуть

Для опытов я подготовил образы жёстких дисков с предустановленными операционными системами. Это DOS 5.0 советской русификации, русифицированная Windows 95, а также образ дискеты с любительской Колибри 2009 года. Колибри - любительская ОС с графическим интерфейсом, но ядром написанном на ассемблере! Эмулятор позволяет задать тип процессора, объём оперативной памяти, а также использовать произвольный каталог как жёсткий диск с файловой системой. Подробно с возможности эмулятора описаны в переводе файла справки. Тип процессора будет задан простейший из поддерживаемых - 80486.

Первая скрипка - MS-DOS 5.0, память 4 Мб:

При загрузке ничего необычного, для оценки производительности запускаем легендарную демку MARS.EXE:

Итог меня весьма удивил - всего 2 (два) кадра в секунду! Для сравнения, давно устаревший компьютер с процессором Am386DX-40 на этой демке выдавал около 15 кадров в секунду! Итоговая производительность - 80386 на 5 МГц! Эмулируемая машина на уровне РС АТ на 80286! Я ожидал явно большего...

Вторым номером идёт Windows 95, но я увеличил размер оперативной памяти до 32 Мб - хотя таких объёмов в персональных компьютерах на 80386 отродясь не было.

Время загрузки - 8,5 минут! Можно неспешно чаю с пряниками попить.

Отрисовка окошек идёт очень долго и чтобы открыть свойства компьютера, нужно ждать около полминуты:

В покое Windows 95 потребляет около 50% машинного времени, или порядка 2,5 МГц процессорного времени 80386. Неплохо! Но на такой скорости в Windows 95 работать практически невозможно.

Теперь настало время испытать одну из вершин программирования - любительскую операционную систему Колибри! Ядро этой операционной системы написано на ассемблере с тщательной оптимизацией.

Для загрузки требуется менее трёх минут, это втрое быстрее, чем для загрузки Windows 95! Окошки отрисовываются в течении пяти - десяти секунд. Разрешение выбрано 640 х 480.

Для пробы запустил игрушку "Тетрис", всё работает, но отрисовка каждого кадра занимает полсекунды.

Это при загрузке процессора 92%

Я был сильно удивлён результатами, хотя тот же FastDOSBox, специально оптимизированный для микрокомпьютеров при испытаниях показал даже худшие результаты. У меня появились сильные сомнения и я начал искать примеры запуска Windows 95 на микрокомпьютерах. Результат - на аналогичном ядре ARM1176, но разогнанном с 700 до 800 МГц и (это важно) увеличенным лимитом оперативной памяти 128 Мб, время загрузки составило три минуты! Это примерно 7,5 минут для частоты 330 МГц, то есть одного порядка цифры. После проведённых экспериментов, мне не совсем понятно, зачем народ пытается Windows 98 на микрокомпьютерах использовать. А вот любительская Колибри показала впечатляющие результаты!

Увы, эмулировать машину х86 РС АТ хоть и можно, но скорость работы оставляет желать значительно лучшего и позволяет разве что запускать простенькие игрушки наподобие PacMan.


Благодарю за внимание, доброго здоровья!



Сайт работает на микрокомпьютере