Presumibilmente è in qualche modo legato alla memoria? Cosa sarebbe
sudo cat /dev/urandom > /dev/mem
fare? Cestinare tutta la RAM? Tutta la memoria virtuale non kernel? Nessuno dei precedenti?
Presumibilmente è in qualche modo legato alla memoria? Cosa sarebbe
sudo cat /dev/urandom > /dev/mem
fare? Cestinare tutta la RAM? Tutta la memoria virtuale non kernel? Nessuno dei precedenti?
Risposte:
Fornisce accesso alla memoria fisica del sistema.
La mem(4)
pagina man spiega di più su cosa /dev/mem
sia.
Sì, potrebbe causare tutti i tipi di problemi. Un riavvio dovrebbe risolverti, ma le cose brutte possono accadere molto facilmente. Stai attento! :-)
/ dev / mem fornisce l'accesso alla memoria fisica del sistema , non alla memoria virtuale. Lo spazio degli indirizzi virtuali dei kernel è accessibile tramite / dev / kmem.
Viene utilizzato principalmente per accedere agli indirizzi di memoria IO relativi all'hardware periferico, come gli adattatori video.
sudo cat /dev/urandom > /dev/mem
non farà nulla, poiché sudo eleverà il privilegio di gatto ma non di reindirizzamento. Puoi fare sudo su
e poi lavorare nella shell di root, oppure usare
sudo dd if=/dev/urandom of=/dev/mem
/dev/mem
fornisce l'accesso alla memoria fisica, cioè tutta la RAM nel sistema, tuttavia ciò non significa che ti dia pieno accesso in lettura / scrittura alla RAM (vedi l'opzione CONFIG_STRICT_DEVMEM in questo documento). Si noti inoltre che alcune regioni della memoria fisica avranno altri dispositivi come la memoria della scheda video, ecc. Mappati su di essa.
Scrivere alla cieca /dev/mem
comporterà un comportamento incerto, ecco un video di YouTube che fa lo stesso.
Provalo con busybox devmem
busybox devmem
è una piccola utility CLI che mmaps /dev/mem
.
Puoi scaricarlo su Ubuntu con: sudo apt-get install busybox
Utilizzo: leggere 4 byte dall'indirizzo fisico 0x12345678
:
sudo busybox devmem 0x12345678
Scrivi 0x9abcdef0
a quell'indirizzo:
sudo busybox devmem 0x12345678 w 0x9abcdef0
Fonte: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
MAP_SHARED
Quando si esegue il mmapping /dev/mem
, probabilmente si desidera utilizzare:
open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)
MAP_SHARED
fa sì che le scritture vadano immediatamente nella memoria fisica, il che semplifica l'osservazione e ha più senso per le scritture di registro hardware.
CONFIG_STRICT_DEVMEM
e nopat
Per utilizzare /dev/mem
per visualizzare e modificare la RAM normale sul kernel v4.9, è necessario pugno:
CONFIG_STRICT_DEVMEM
(impostato di default su Ubuntu 17.04)nopat
opzione della riga di comando del kernel per x86Le porte IO funzionano ancora senza quelle.
Svuotamento della cache
Se si tenta di scrivere nella RAM anziché in un registro, la memoria potrebbe essere memorizzata nella cache dalla CPU: https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-address-space-in-linux e non vedo un modo molto portatile / semplice per svuotarlo o contrassegnare la regione come invariabile:
Quindi forse /dev/mem
non può essere utilizzato in modo affidabile per passare i buffer di memoria ai dispositivi?
Purtroppo questo non può essere osservato in QEMU, poiché QEMU non simula le cache.
Come provarlo
Adesso per la parte divertente. Ecco alcune fantastiche configurazioni:
volatile
variabile su un processo userland/proc/<pid>/maps
+/proc/<pid>/pagemap
devmem2
e osserva la reazione del processo dell'utente :kmalloc
virt_to_phys
e restituirlo a userlanddevmem2
devmem2
per scrivere nel registroprintf
come esce dal dispositivo virtuale in risposta/ dev / mem tradizionalmente fornito l'accesso all'intero spazio degli indirizzi fisici. Ciò include ram ma include anche eventuali IO Device mappati in memoria.
Molti kernel moderni saranno configurati con "CONFIG_STRICT_DEVMEM" che limita / dev / mem solo agli IO Device mappati in memoria.
Scrivere spazzatura a caso è una cattiva idea, ma esattamente quale cattiverà accadrà è difficile da prevedere. L'hardware può rispondere in modo imprevedibile alla spazzatura casuale, strutture di memoria del kernel danneggiate possono causare comportamenti imprevedibili del kernel. Nella migliore delle ipotesi mi sarei aspettato un arresto anomalo del sistema, nel peggiore dei casi la corruzione dei dati o persino il brick dell'hardware non sono fuori discussione.
PS nota che il tuo comando quando eseguito come un normale utente non dovrebbe fare nulla, perché sudo elimina solo il comando cat, non il reindirizzamento.
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM