Как мне создать собственную виртуальную машину? - PullRequest
2 голосов
/ 11 сентября 2009

Мне интересно, как создать минимальную виртуальную машину, которая будет моделироваться после 16-битной системы Intel. Это был бы мой первый настоящий проект на C, большая часть моего кода длиной в 100 строк или меньше, но я разбираюсь с основными принципами, читаю K & R и понимаю, как все должно работать, так что это в значительной степени испытание ума.

Может ли кто-нибудь рассказать мне о документации, инструментах, учебных пособиях или простых старых советах / указателях о том, как это сделать, пока я понимаю, что мне нужно где-то хранить данные, своего рода ЦП и что-то вроде механизм, который функционирует как контроллер прерываний.

Я делаю это для изучения: внутренних систем, ASM и C - три аспекта вычислений, которые я хочу изучить в отдельном проекте.

Пожалуйста, будьте любезны, не говорите мне сделать что-то попроще - это будет только раздражать. :)

Спасибо за чтение и, надеюсь, написание!

Ответы [ 4 ]

3 голосов
/ 11 сентября 2009

Виртуальные машины делятся на две категории: те, которые интерпретируют инструкцию кода за раз, и те, которые компилируют код в собственные инструкции (например, «JIT»).

Категория интерпретации обычно строится вокруг инструкциицикл выполнения, использующий оператор switch, вычисленные gotos или указатели на функции, чтобы определить, как выполнять каждую инструкцию.

Существует забавная платформа, которую стоит изучить из-за ее простоты и забавности: Corewars.

Corewars - это игра для программирования, в которой программы, написанные в " Redcode ", работают на виртуальной машине MARS.Существует множество MARS VM s, обычно написанных на C.

. Это также вдохновило 8086-основанные версии, где программы написаны в битве ассемблера 8086.

1 голос
/ 11 сентября 2009
1 голос
/ 11 сентября 2009

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

0 голосов
/ 26 июля 2015

Если вы хотите написать виртуальную машину с использованием технологии x86 VMM, вам понадобится совсем немного вещей.

Есть несколько важных инструкций, таких как VM_ENTER / VM_EXIT (имя может меняться в зависимости от чипа, AMD и INTEL используют разные имена, но функциональные возможности совпадают). Эти инструкции на самом деле являются привилегированными, и поэтому вам нужно написать модуль ядра, чтобы использовать их.

Первый шаг для запуска вашей виртуальной машины - ее загрузка, и поэтому вам понадобится «BIOS», который будет загружен. Затем вам нужно эмулировать устройства и т. Д. Вы можете даже запустить старую версию MSDOS на такой виртуальной машине, если хотите.

В целом, это явно не тривиально и требует много времени и усилий.

Теперь вы можете сделать что-то похожее на то, что делала VMWare до появления процессоров, готовых к виртуализации.

...