Fazer x86 instruções requerem sua própria codificação, bem como todos os seus argumentos para estar presente na memória, ao mesmo tempo?

savvybug:

Eu estou tentando descobrir se é possível executar uma VM Linux cuja RAM só é apoiado por uma única página física.

Para simular isso, eu modificado o manipulador de falha de página aninhada no KVM para remover o presente pouco de toda a tabela página nested entradas (TNP), exceto aquele que corresponde à falha de página atualmente processado.

Ao tentar iniciar um convidado Linux, observei que as instruções de montagem que operandos memória uso, como

add [rbp+0x820DDA], ebp

levar a um circuito de falha de página até restaurar o presente pouco para a página contendo a instrução, bem como para a página referenciado no operando (neste exemplo [rbp+0x820DDA]).

Eu estou querendo saber porque este é o caso. Caso não o acesso CPU as páginas de memória sequencialmente, ou seja, primeiro leia as instruções e, em seguida, acessar o operando de memória? Ou será x86 exigem que a página de instruções, bem como todas as páginas operando são acessíveis ao mesmo tempo?

Estou testando em AMD Zen 1.

Peter Cordes:

Sim, eles exigem o código de máquina e todos os operandos de memória.

Caso não o acesso CPU as páginas de memória sequencialmente, ou seja, primeiro leia as instruções e, em seguida, acessar o operando de memória?

Sim isso é logicamente o que acontece, mas as interrupções de exceção uma página a falhas que o processo 2-step e descarta qualquer progresso. A CPU não tem qualquer maneira de lembrar o que a instrução era no meio de quando uma página-falha ocorreu.

Quando um manipulador de falta de página retorna após lidar com uma falha de página válido, RIP = o endereço da instrução falha, assim que as tentativas de CPU executá-lo a partir do zero .

Seria legal para o sistema operacional para modificar o código de máquina da instrução falha e esperar que ele para executar uma instrução diferente depois iretdo manipulador de falta de página (ou qualquer outra exceção ou manipulador de interrupção). Então AFAIK é arquitetonicamente necessário que os Refaz CPU código-busca de CS: RIP no caso que você está falando.

É, provavelmente, também arquitetonicamente necessário para hypervisor de entrada / saída. E mesmo se não é proibido no papel, não é como o trabalho CPUs.


Algumas instruções são interruptível e pode fazer progresso parcial, como rep movse outras instruções de cordas, ou reunir cargas / lojas de dispersão. Mas o único mecanismo é de actualização dos registos arquitectónicos como RCX / RSI / RDI, ou o destino e máscara registros de coleta. Não manter os resultados opcode / decodificação em algum registro interno escondido e reiniciá-lo após iret de um manipulador de falha de página. Estas são instruções que fazem vários acessos de dados separados.

Também tenha em mente que x86 (como a maioria das ISA) garante que as instruções são wrt atômica. interrupções / exceções: ou acontecer completamente, ou não acontecem a todos, antes de uma interrupção. Assim, por exemplo add [mem], regseriam necessários para descartar a carga se a parte loja criticada.


O pior número do processo de hóspedes páginas do espaço do usuário apresentar a fazer progressos para a frente poderia ser 6:

  • movsqou movswinstrução 2-byte abrangendo um limite de página, então ambas as páginas são necessários para que possa descodificar.
  • fonte QWORD operando [rsi]também uma página-split
  • destino QWORD operando [rdi]também uma página-split

Se qualquer um desses 6 páginas falha, estamos de volta para um quadrado.

rep movsdé também uma instrução de 2 bytes, e fazer progressos em um passo de que teria a mesma exigência. Casos semelhantes gosta push [mem]ou pop [mem]pode ser construído com uma pilha desalinhado.

@Brandon aponta nos comentários que o hóspede terá suas tabelas de páginas na memória, ea página splits do espaço do usuário também pode ser splits 1GiB assim que os dois lados estão em diferentes sub-árvores do PML4 nível superior. HW página caminhada precisa tocar todos esses hóspedes páginas page-mesa para fazer progresso.

E contadores de desempenho PMU pode ser habilitado e configurado de tal forma que a instrução também requer escrever um evento perf a uma gravação em um buffer PEBS para que a instrução.

Acho que você gosta

Origin http://10.200.1.11:23101/article/api/json?id=383706&siteId=1
Recomendado
Clasificación