Teste com busybox devmem
busybox devmem
é um pequeno utilitário da CLI que mmaps /dev/mem
.
Você pode obtê-lo no Ubuntu com: sudo apt-get install busybox
Uso: leia 4 bytes do endereço físico 0x12345678
:
sudo busybox devmem 0x12345678
Escreva 0x9abcdef0
para esse endereço:
sudo busybox devmem 0x12345678 w 0x9abcdef0
Fonte: link
MAP_SHARED
Quando mmapping /dev/mem
, você provavelmente vai querer usar:
open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)
MAP_SHARED
faz as gravações irem para a memória física imediatamente, o que facilita a observação e faz mais sentido para as gravações de registro de hardware.
CONFIG_STRICT_DEVMEM
e nopat
Para usar o /dev/mem
para visualizar e modificar a memória RAM regular no kernel v4.9, você deve manipular:
- desabilite
CONFIG_STRICT_DEVMEM
(definido por padrão no Ubuntu 17.04)
- passe a opção de linha de comando do kernel
nopat
para x86
Os portos de IO ainda funcionam sem esses.
Veja também: link
Cache flushing
Se você tentar gravar na RAM em vez de um registrador, a memória pode ser armazenada em cache pela CPU: link e não vejo uma maneira muito portátil / fácil de liberar ou marcar a região como não encaixável:
Então, talvez /dev/mem
não possa ser usado de forma confiável para passar buffers de memória para dispositivos?
Isso não pode ser observado no QEMU, infelizmente, já que o QEMU não simula caches.
Como testar isso
Agora para a parte divertida. Aqui estão algumas configurações legais:
-
Memória da terra do usuário
- alocar a variável
volatile
em um processo userland
- obtenha o endereço físico com
/proc/<pid>/maps
+ /proc/<pid>/pagemap
- o endereço físico com
devmem2
e observe o processo da área do usuário reagir:
-
Memória de Kernelland
- aloca memória do kernel com
kmalloc
- obtenha o endereço físico com
virt_to_phys
e passe-o de volta à userland
- modifique o endereço físico com
devmem2
- consulte o valor do módulo do kernel
-
Dispositivo de plataforma virtual IO mem e QEMU
- crie um dispositivo de plataforma com endereços de registro físico conhecidos
- use
devmem2
para gravar no registro
- assista
printf
s sair do dispositivo virtual em resposta