Лучший способ реализовать ввод / вывод в виртуальной машине? - PullRequest
1 голос
/ 20 ноября 2010

Я пишу виртуальную машину - не эмулятор существующей архитектуры, такой как Virtualbox, а скорее что-то вроде JVM или BEAM - с собственным набором команд, моделью памяти и т. Д. В конце концов я планирую реализовать очень маленькуюпростой (но тьюринг-завершенный) язык высокого уровня, который будет компилироваться в его байт-код, просто для удовольствия.

Конечно, машина должна иметь некоторую поддержку ввода-вывода, но я не хочу ограничивать ее только манипуляциями с stdin / stdout.Я представляю что-то вроде модульных «виртуальных устройств», которые могут быть реализованы в виде разделяемых библиотек, так что виртуальная машина может загружать их во время выполнения и связываться с ними через стандартный интерфейс.Таким образом, например, у нас могут быть «виртуальные устройства» для стандартного ввода / вывода, графика (представьте себе виртуальное устройство, которое позволяет вашей программе VM рисовать вещи внутри окна SDL) или, возможно, даже сеть.

Вопросэто: как программы, написанные для ВМ, должны взаимодействовать с виртуальными устройствами?Я решил подражать методам, которые используются на реальном оборудовании, и узнал о вводе-выводе на основе портов и отображении в памяти.Однако я не уверен, какой из них больше подходит для моих целей.Можете ли вы предложить, какой из них лучше, или, может быть, даже указать совершенно другой метод для работы с вводом / выводом?

Заранее спасибо.

1 Ответ

0 голосов
/ 20 ноября 2010

Как отображение в память, так и на основе порта не подходят для большинства операций ввода-вывода.

Запрос DMA с блок-копией обычно является тем, что вам нужно.

...