Por que a emulação da CPU é lenta [fechada]

3

Diferentes operações de CPU (IA-32, ARM9 etc.) devem ser equivalentes em sua natureza (mover, ler, gravar dados etc.). Não deveria ser tão doloroso para CPUs diferentes se imitarem. Mas parece que não é tão fácil, já que o software emulado é executado muito devagar. Poderíamos simplesmente converter um arquivo executável e depois executá-lo? Por que é tão dependente de recursos? (Por que eu preciso de uma CPU poderosa para emular outra CPU)? Tenho que dizer que não tenho grandes habilidades de programação de baixo nível. Muito obrigado.

    
por user2543574 05.01.2014 / 18:40

2 respostas

4

Primeiro, embora haja instruções que sejam muito semelhantes, não há um conjunto de instruções que sempre se comporte da mesma maneira em diferentes arquiteturas de CPU. Para emulação precisa, não é o suficiente (geralmente) para traduzir cada instrução - você tem que lidar com acessos de memória, temporizações, interrupções ... e isso é apenas para a CPU.

Parece que o que você está pensando é a recompilação estática, mas é muito difícil de fazer (na verdade, acho que se resume ao interrompendo o problema , tornando-o realmente impossível na teoria). Na prática, às vezes podemos fazer isso para um subconjunto de programas, mas você não pode escrever um compilador de propósito geral que usa o código de objeto para uma arquitetura como entrada e gera um código perfeitamente equivalente para outra. Por exemplo, seria difícil lidar com código auto-modificador usando esse método.

A recompilação dinâmica (que gera código on-the-fly enquanto o programa é executado) é mais bem sucedida (ainda não trivial para fazer o certo). Os problemas específicos dependerão da arquitetura, no entanto. Em muitos casos, emular a CPU não é o problema, mas emular vários dispositivos periféricos, mantendo o tempo exato, é (veja, por exemplo, artigo do byuu sobre como emular o SNES ).

Às vezes, você pode ignorar muitas dessas restrições e ainda simular hardware o suficiente para ter um subconjunto do software funcionando, mas nunca é possível (até onde eu sei) ter 100% de precisão com zero de sobrecarga, a menos que você tenha hardware real.

    
por 05.01.2014 / 22:09
5

Different CPU (IA-32, ARM9 etc.) operations should be equivalent in their nature (move, read, write data etc.).

Eles devem ser, mas não são. Uma arquitetura de CPU implementa essas operações básicas de acordo com o que seus projetistas imaginaram - e isso pode ser muito diferente dependendo do que os projetistas estão tentando realizar. Coisas que podem ser feitas em uma instrução em algumas CPUs podem requerer muitas, muitas instruções em outras.

Could we simply convert an executable file, then execute it? Why it's so resource dependent anyway (why do I need a powerful CPU to emulate other CPU)?

Se tudo o que você quer fazer é emular a CPU, isso pode ser feito e feito com relativa facilidade. "Convertendo" um arquivo executável em tempo real é chamado de "recompriação dyamic" e muitos emuladores fazem isso já. Normalmente, porém, alguém quer emular uma plataforma inteira. Isso inclui hardware que não seja a CPU e, às vezes, é difícil emular esse hardware (o Atari 2600 TIA, por exemplo) ou mal documentado (o hardware de vídeo PPU da NES ou mesmo o hardware atual da GPU) ou ambos. As CPUs sempre funcionam no contexto de uma plataforma e geralmente o software espera que a CPU + a plataforma funcionem de uma determinada maneira. Os requisitos para emular uma plataforma, e fazer isso com os requisitos de tempo estritos normalmente exigidos, é a parte mais difícil e que exige muitos recursos.

    
por 05.01.2014 / 23:51