Я достиг 100% последовательных результатов следующим образом:
- Настройка Bochs с MS-DOS.
- Настройте ваш набор инструментов для целевой MS-DOS
& Mdash; или & mdash;
- Настройте ваш набор инструментов на 32-битную Windows
- Установите расширитель HX-DOS в Bochs.
- При необходимости взломайте стандартную библиотеку / среду выполнения вашего инструментария и отключите / удалите функции, для которых требуются API-интерфейсы Windows, не реализованные в HX-DOS. Расширитель напечатает список нереализованных API, когда вы попытаетесь запустить программу.
- Уменьшите количество циклов в своем тесте на несколько порядков.
- Оберните тестовый код инструкциями ассемблера
cli
/ sti
(обратите внимание, что двоичный файл не будет работать в современных ОС после этого изменения).
- Если вы еще этого не сделали, сделайте в своем тесте
rdtsc
дельты для определения времени. Образцы должны соответствовать инструкциям cli
& hellip; sti
.
- Запустите его в Бохах!
Результат представляется полностью детерминированным, но не является точной оценкой общей эффективности (подробности см. В обсуждении под ответом Османа Турана).
В качестве бонуса, вот простой способ поделиться файлами с Bochs (так что вам не нужно каждый раз размонтировать / перестраивать / перемонтировать образ дискеты):
В Windows Bochs заблокирует файл образа дискеты, но файл все еще открывается в режиме общей записи. Это означает, что вы не можете перезаписать файл, но вы можете записать в него. (Я думаю, * операционные системы * nix могут вызывать перезапись для создания нового файла, если речь идет о файловых дескрипторах.) Хитрость заключается в использовании dd
. У меня был настроен следующий пакетный скрипт:
... benchmark build commands here ...
copy /Y C:\Path\To\Benchmark\Project\test2dos.exe floppy\test2.exe
bfi -t=288 -f=floppysrc.img floppy
dd if=floppysrc.img of=floppy.img
bfi
- это Барт Создание образа дискеты .
Затем просто смонтируйте floppy.img
в Bochs.
Бонусный совет №2. Чтобы не запускать тест каждый раз вручную в Bochs, поместите пустой файл go.txt
в каталог дискет и запустите этот пакет в Bochs:
@echo off
A:
:loop
choice /T:y,1 > nul
if not exist go.txt goto loop
del go.txt
echo ---------------------------------------------------
test2
goto loop
Он запускает тестовую программу каждый раз, когда обнаруживает свежее изображение с дискеты. Таким образом, вы можете автоматизировать запуск теста в одном скрипте.
Обновление: этот метод не очень надежен. Иногда время может измениться на 200%, просто переупорядочив некоторые тесты (эти изменения времени не наблюдались при запуске на реальном оборудовании с использованием методов, описанных в первоначальном вопросе).