Pergunta

Estou escrevendo uma máquina virtual - não um emulador de arquitetura existente como o VirtualBox, mas algo como a JVM ou o feixe - com seu próprio conjunto de instruções, modelo de memória etc. Eventualmente, estou planejando implementar um pequeno e simples (mas Turing-complete) linguagem de alto nível que compilaria seu bytecode, apenas por diversão.

Obviamente, a máquina deve ter algum suporte de E/S, mas não quero limitá -la apenas a manipulações com stdin/stdout. Imagino algo como "dispositivos virtuais" modulares, que podem ser implementados como bibliotecas compartilhadas para que a VM possa carregá -los no tempo de execução e se comunicar com eles através de uma interface padrão. Dessa forma, por exemplo, podemos ter "dispositivos virtuais" para entrada/saída padrão, gráficos (imagine um dispositivo virtual que permite que o programa VM desenhe coisas dentro de uma janela SDL) ou talvez até uma rede.

A questão é: como os programas escritos para a VM se comunicam com os dispositivos virtuais? Decidi imitar técnicas empregadas com hardware real e aprendi sobre a E/S baseada em porta e a E/S mapeada de memória. No entanto, não tenho certeza de qual deles é mais adequado para meus objetivos. Você pode sugerir qual é o melhor ou talvez até apontar uma técnica totalmente diferente para lidar com a entrada/saída?

Desde já, obrigado.

Foi útil?

Solução

Tanto mapeada na memória quanto baseados em porta são inadequados para a maioria das E/S.

A solicitação de DMA com copia em bloco geralmente é o que você deseja.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top