Para a questão do RPi, consulte este tópico (essencialmente você pode usar algo como QEMU para executar as imagens).
Para responder à pergunta principal:
Is it possible to virtualize any CPU on any other CPU?
Sim (até certo ponto), no entanto, pode não ser tão eficiente quanto você imagina. E deve-se notar que o tipo de virtualização VirtualBox / VMWare é diferente do que você está pedindo, o que na verdade é Is it possible to EMULATE any CPU on any other CPU?
.
As CPUs são componentes de hardware que possuem um conjunto específico de instruções (também conhecidas como códigos operacionais) ligadas a elas; esses códigos operacionais são valores numéricos específicos que podem ser traduzidos em um nível elétrico, de modo que a CPU realmente "faça alguma coisa".
Quando o software é escrito para dizer à CPU para 'fazer algo' (como uma calculadora), o software deve ser construído (direcionado) para uma CPU específica. Isso quer dizer que meu software deve ser compilado (traduzido) e montado de forma que as instruções da máquina possam ser entendidas pela máquina em que estou executando o software, caso contrário, se não for executado, talvez não obtenha os resultados EXATOS Eu estou esperando. As instruções de montagem (op-codes) para algo como 2 + 2 em um ARM podem não corresponder exatamente às instruções de montagem em um PIC ou FPGA, e o que eu recuperaria seria lixo (novamente, SE fosse executado).
Cada CPU 'faz algo' um pouco diferente, muito como eu posso escrever na língua inglesa para transmitir meus pensamentos para você, eu também poderia transmitir os mesmos pensamentos em espanhol ou japonês, embora eu tenha que transmiti-los bastante diferentemente devido às diferenças sintáticas em inglês / espanhol / japonês, mas as diferenças em como essas linguagens são contextualmente analisadas também. Se você e eu estivéssemos conversando (vs. comunicação escrita), e você só falava japonês e eu espanhol, então precisaríamos de um tradutor que fosse fluente nas duas línguas para se comunicar adequadamente, embora fosse mais lento que a comunicação direta, porque nós precisamos que nossas linguagens sejam analisadas corretamente, de modo que nada seja "perdido na tradução".
Este é o mesmo conceito com a virtualização / emulação de CPU. Se você deseja executar aplicativos que não foram criados para a CPU em que você está executando (ou seja, eu quero executar o software ARM no meu PC x86), um programa precisa usar o assembly ARM e convertê-lo para o assembly x86, para que chamada para draw word on screen
não é uma chamada para erase RAM location X
.
É por isso que não é necessariamente viável emular adequadamente qualquer CPU em qualquer outra CPU (desde que não seja possível emular x86 em um PIC em si). A CPU faz muito mais do que apenas "números crunch", e eles fazem tudo isso "muito mais" muito rápido, e exigem muito tempo para que tudo seja exato. Quando você emula uma CPU, você está essencialmente adicionando uma camada de tradução entre o software e o hardware. Adicionar essa camada pode adicionar uma quantidade significativa de tempo à execução das instruções, devido a quantas instruções extras podem precisar ser executadas. Esse tempo adicional pode ser tão demorado que o software não responde ou é geralmente inutilizável (como jogar videogame a 1 quadro por segundo, com certeza você pode fazer isso, mas levará apenas 2 minutos para escrever o texto 'press start' na tela).
Deve-se notar que, se o hardware (a CPU) tiver o mesmo conjunto de instruções incorporado, ele deverá "fazer a mesma coisa" que o outro conjunto de instruções pretendido; Por exemplo (questões de patente / licenças à parte) A Intel poderia decidir adicionar os conjuntos de instruções para o processador ARM em uma linha de suas CPUs x86_64 para que você pudesse executar os binários ARM diretamente naquela CPU, mas eles ainda teriam que ter a arquitetura 'do' como a arquitetura ARM 'faz' ou a saída pode não ser exata.
Assim, pode ser possível emular um tipo de CPU em outro tipo de CPU, mas dependendo de como / o que é emulado, pode ser tão lento a ponto de ser considerado inatingível, ou pode ser indistinguível do ponto de vista humano ( ou seja, subjetivamente é "tão rápido" quanto rodando no hardware nativo, mas tecnicamente falando não é).
Espero que isso ajude a adicionar alguma clareza.