O que é cpu_entry_area?

1

A documentação do kernel Linux descreve o mapa de memória virtual .

Diz:

fffffe0000000000 - fffffe7fffffffff (=39 bits) cpu_entry_area mapping

O que é essa "área de entrada da CPU"? É acessível, de alguma forma, para código em execução no anel 3 (ou seja, CPL3)?

Eu pergunto porque estou experimentando com o QEMU, e parece que algum código CPL3 executado no guest do QEMU (servidor Ubuntu 18.04) tenta (não sei se é bem-sucedido) acessar a memória em cpu_entry_area . < br> No começo, achei que fiz algo errado, pois achei que todos os endereços acima de 0x00007fffffffffff não estavam acessíveis para CPL3, mas depois descobri sobre vsyscall (consulte aqui ).

Eu tentei acessar vsyscall memória (especificamente *(int *)0xffffffffff600000 ) do código CPL3 no convidado QEMU e obtive êxito, mas recebi um segfault quando tentei acessar o cpu_entry_area (especificamente *(int *)0xfffffe0000000ee0 ). / p>     

por Oren Milman 20.10.2018 / 19:23

1 resposta

2

cpu_entry_area contém todos os dados e códigos necessários para permitir que a CPU controle manualmente o kernel. Quando o KPTI está ativado, apenas essa parte do kernel é mapeada quando o espaço do usuário está em execução. Você pode ver sua definição em arch/x86/include/asm/cpu_entry_area.h : contém

  • o GDT;
  • a pilha de entrada;
  • o TSS;
  • um conjunto de trampolins;
  • as pilhas de exceções;
  • depurar lojas e buffers.

Os trampolins contêm os pontos de entrada para syscalls; veja, por exemplo, arch/x86/entry/entry_64.S que define o ponto de entrada para chamadas de 64 bits.

Nada disso é acessível diretamente do anel 3, mas o código do anel 3 pode saltar para ele usando mecanismos mediados pela CPU que permitem alterar os níveis de privilégios ( por exemplo, a instrução SYSCALL da CPU).

Documentation/x86/pti.txt fornece mais contexto.

    
por 20.10.2018 / 20:13