A proteção de memória não deve interromper o acesso à RAM física para todos os processos, exceto aquele que foi atribuído a essa área da RAM? Ou o sudo substitui essa proteção?
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! :-)
Eu sugiro revisar a página de manual do mem. Trapos estão corretos. "mem é um arquivo de dispositivo de caractere que é uma imagem da memória principal do computador. Pode ser usado, por exemplo, para examinar (e até corrigir) o sistema. Endereços de bytes em mem são interpretados como endereços de memória física." E ... "O arquivo kmem é o mesmo que mem, exceto que a memória virtual do kernel em vez da memória física é acessada."
Shickadance
@ Andrew Flanagan: Seu link agora mostra como alguém pode configurar um cronômetro usando o comando time.
Aiyion.Prime
11
@ Aiyion.Prime. Obrigado - apontou para uma versão do archive.org.
Andrew Flanagan
19
/ dev / mem fornece acesso à memória física do sistema , não à memória virtual. O espaço de endereço virtual dos kernels pode ser acessado usando / dev / kmem.
É usado principalmente para acessar endereços de memória IO relacionados a hardware periférico, como adaptadores de vídeo.
sudo cat /dev/urandom > /dev/memnão fará nada, já que o sudo elevará o privilégio de gato, mas não o redirecionamento. Você pode fazer sudo sue trabalhar no shell raiz ou usar sudo dd if=/dev/urandom of=/dev/mem
/dev/memfornece 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/memresultará em um comportamento incerto. Aqui está um vídeo do youtube fazendo o mesmo.
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/mempara visualizar e modificar a RAM normal no kernel v4.9, você deve primeiro:
desativar CONFIG_STRICT_DEVMEM(definido por padrão no Ubuntu 17.04)
passe a nopatopção de linha de comando do kernel para x86
O / 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
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! :-)
fonte
/ dev / mem fornece acesso à memória física do sistema , não à memória virtual. O espaço de endereço virtual dos kernels pode ser acessado usando / dev / kmem.
É usado principalmente para acessar endereços de memória IO relacionados a hardware periférico, como adaptadores de vídeo.
fonte
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 fazersudo su
e trabalhar no shell raiz ou usarsudo 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.fonte
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
:Escreva
0x9abcdef0
para esse endereço:Fonte: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
MAP_SHARED
Ao mmapping
/dev/mem
, você provavelmente deseja usar: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
enopat
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 respostafonte
O / 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.
fonte