Симулятор процессорного ядра по принципу статической компиляции. Интересная идея. Пусть у нас есть elf. Коорый мы распарсили, и знаем - вот код, вот здесь надо править константы для переходов, вот тут данные и проч.
Пусь у нас есть "библиотека эмуляции ядра" - набор функций, которые реализуют все группы команд ядра. Для современных RISC ядер их не более 200, хотя самих вариантов команд очень много.
Мы берем распарсенный код и elf, и делаем из него массив.
Типа вот адрес, вот лежит команда по адресу, а вот указатель на функцию, а вот указатель на набор данных, с которыми надо функцию вызвать.
Устраняется этап декодирования команд, также можно сделать много оптимизации для повышения скороси симуляции.
На этом же этапе проводится компиляция модели аппаратуры, и она исполняется синхронно с "кодом ядра".
Высвободившееся процессорное время тратим на симуляцию кешей, MMU, и периферии процессорного ядра.
Можно получить cycle accurate симулятор досаточно сложной системы с эффективной частотой в сотни Мгц, чего достаточно для многих практических целей.
Есть еще одна тонкость. Многопоточность современных ПК.
AMD Ryzen Threadripper 1950X - примерно 63кр у нас.
AMD Ryzen Threadripper 1920X - примерно 50кр у нас. 12 ядер 24 потока
ASUS PRIME X399-A - мамка под него, одна з самых дешевых. 19кр.
Получаем 16 ядер 32 потока
https://3dnews.ru/956770
Можно Intel® Xeon® Processor D - подешевле, медленее.
http://caxapa.ru/584927.html
Думаю, найдется не так много практических дизайнов встраиваемх систем, в которых более 32 аппаратных блоков (UART можно симулировать в режиме разделения времени одного процессорного ядра симулятора - он в жизни работает сильно медленее любого современного ядра).
Будет полный параллелизм моделирования. Хоть что-то загрузит всю кучу потоков :)