Estou fazendo uma pesquisa sobre máquinas virtuais e os anéis em que estão rodando. Pela documentação, isso à s vezes é difÃcil de encontrar. Portanto, gostaria de executar as VMs e, em seguida, dar uma olhada nos processos e ver em qual anel eles estão sendo executados.
Segundo o blog-post de Gustavo Duarte o CPL-Register é configurado pelo processador de acordo com o anel do processo. Aqui @Stephen Kitt mencionou que existem possibilidades. A solução em usar gdb retorna conforme mencionado como o valor de registro Ring3. Eu tentei com o processo como ModemManager
ou iwlwifi
que eu suponho estar rodando em Ring0, mas todos eles retornaram Ring3 como seu conteúdo de registro cs.
A maneira sugerida é usar ftrace
. Mas este programa é seriamente complexo e não consegui encontrar um tutorial. Alguém conhece as linhas mágicas para obter apenas o CS de um processo?
Existe alguma outra maneira de recuperar o valor do registrador CS?
Em x86, não há necessidade real de outra maneira de descobrir em qual anel um processo está sendo executado, porque o registrador CS determina totalmente o anel ativo. Como você está executando VMs, dependendo de qual hipervisor você possui, pode ser possÃvel usar recursos de depuração para ver o valor atual do CS virtual dentro de uma VM, de fora.
O grande problema com a recuperação do valor de CS dentro de um sistema em execução é que o valor de CS será totalmente determinado pela natureza da sonda que você usa para recuperar o valor. Se você usar uma sondagem de espaço do usuário, sempre verá um valor correspondente ao espaço do usuário; se você usar uma sonda de nÃvel de kernel ( kprobe ou ftrace ), sempre verá um valor correspondente a kernel-space.
De qualquer forma, no Linux em bare metal, a situação é bastante direta: o código do usuário é executado no anel 3, o kernel é executado no anel 0 e é isso. Isso não tem nada a ver com privilégios no nÃvel do usuário: os processos executados como root ainda são principalmente códigos no nÃvel do usuário, portanto, eles serão executados no anel 3 na maior parte do tempo. A única vez que um processo de usuário é executado no anel 0 é quando ele chama uma chamada do sistema, e você não pode interromper isso usando
gdb
para ver o anel ativo como anel 0.No Xen com VMs paravirtualizadas, a situação é um pouco diferente; o hipervisor é executado no anel 0, o espaço do usuário é executado no anel 3 e o kernel é executado no anel 1 (no x86 de 32 bits) ou no anel 3 (no x86 de 64 bits).