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.
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 iret
do 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 movs
e 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], reg
seriam 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:
movsq
oumovsw
instruçã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.