Presumivelmente, está de alguma forma relacionado à memória? O que seria
sudo cat /dev/urandom > /dev/mem
Faz? Lixeira toda RAM? Toda a memória virtual que não é do kernel? Nenhuma das acima?
Presumivelmente, está de alguma forma relacionado à memória? O que seria
sudo cat /dev/urandom > /dev/mem
Faz? Lixeira toda RAM? Toda a memória virtual que não é do kernel? Nenhuma das acima?
Respostas:
Ele fornece acesso à memória física do sistema.
A mem(4)
página do manual explica mais sobre o que /dev/mem
é.
Sim - isso pode causar todos os tipos de problemas. Uma reinicialização deve corrigi-lo, mas coisas ruins podem acontecer com muita facilidade. Seja cuidadoso! :-)
sudo cat /dev/urandom > /dev/mem
não fará nada, já que o sudo elevará o privilégio de gato, mas não o redirecionamento. Você pode fazer sudo su
e trabalhar no shell raiz ou usar
sudo dd if=/dev/urandom of=/dev/mem
/dev/mem
fornece acesso à memória física, ou seja, toda a RAM do sistema, no entanto, isso não significa que ele fornece acesso total de leitura / gravação à RAM (consulte a opção CONFIG_STRICT_DEVMEM neste documento). Observe também que algumas regiões da memória física terão outros dispositivos, como a memória da placa de vídeo, etc. mapeados nela.
Escrever às cegas /dev/mem
resultará em um comportamento incerto. Aqui está um vídeo do youtube fazendo o mesmo.
Teste com busybox devmem
busybox devmem
é um pequeno utilitário 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: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
MAP_SHARED
Ao mmapping /dev/mem
, você provavelmente deseja 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 /dev/mem
para visualizar e modificar a RAM normal no kernel v4.9, você deve primeiro:
CONFIG_STRICT_DEVMEM
(definido por padrão no Ubuntu 17.04)nopat
opção de linha de comando do kernel para x86As portas de E / S ainda funcionam sem elas.
Consulte também: https://stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582
Liberação de cache
Se você tentar gravar na RAM em vez de um registro, a memória poderá ser armazenada em cache pela CPU: https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-address-space-in-linux e não vejo uma maneira muito portátil / fácil de liberá-lo ou marcar a região como inatingível:
Então, talvez /dev/mem
não possa ser usado com segurança para passar buffers de memória para os dispositivos?
Infelizmente, isso não pode ser observado no QEMU, pois o QEMU não simula caches.
Como testá-lo
Agora a parte divertida. Aqui estão algumas configurações legais:
volatile
variável em um processo da terra do usuário/proc/<pid>/maps
+/proc/<pid>/pagemap
devmem2
e observe o processo da terra do usuário reagir:kmalloc
virt_to_phys
e passá-lo de volta para a terra do usuáriodevmem2
devmem2
para escrever no registroprintf
saem do dispositivo virtual em respostaO / dev / mem tradicionalmente fornecia acesso a todo o espaço de endereço físico. Isso inclui ram, mas também inclui dispositivos de E / S mapeados na memória.
Muitos kernels modernos serão configurados com "CONFIG_STRICT_DEVMEM", que restringe / dev / mem apenas aos dispositivos de E / S mapeados na memória.
Escrever lixo aleatório nele é uma péssima idéia, mas exatamente o que acontecerá com a maldade é difícil de prever. O hardware pode responder de maneira imprevisível ao lixo aleatório; as estruturas de memória do kernel corrompidas podem causar um comportamento imprevisível do kernel. Na melhor das hipóteses, eu esperaria uma falha do sistema, na pior das hipóteses, a corrupção de dados ou até a obstrução de hardware não estão fora de questão.
O PS nota que seu comando quando executado como um usuário normal não deve fazer nada, porque o sudo apenas elavora o comando cat, não o redirecionamento.
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM