Muhtemelen bir şekilde hafıza ile ilgili? Ne olurdu
sudo cat /dev/urandom > /dev/mem
yap? Bütün RAM'leri mi çöp? Tüm çekirdek olmayan sanal bellek? Yukarıdakilerin hiçbiri?
Muhtemelen bir şekilde hafıza ile ilgili? Ne olurdu
sudo cat /dev/urandom > /dev/mem
yap? Bütün RAM'leri mi çöp? Tüm çekirdek olmayan sanal bellek? Yukarıdakilerin hiçbiri?
Yanıtlar:
Sistemin fiziksel belleğine erişim sağlar.
mem(4)
Adam sayfa gerekenler hakkında daha fazla açıklar /dev/mem
olduğunu.
Evet - her türlü soruna neden olabilir. Bir yeniden başlatma sizi düzeltir, ancak kötü şeyler çok kolay olabilir. Dikkatli ol! :-)
/ dev / mem , sanal belleğe değil, sistemin fiziksel belleğine erişim sağlar . Çekirdek sanal adres alanına / dev / kmem kullanılarak erişilebilir.
Öncelikle video bağdaştırıcıları gibi çevre birimlerle ilgili IO bellek adreslerine erişmek için kullanılır.
sudo cat /dev/urandom > /dev/mem
bir şey yapmayacak, çünkü sudo kedinin imtiyazını yükseltecek, ancak yönlendirme değil. Ya yapabilirsiniz sudo su
ve kök kabuğunda sonra çalışma veya kullanım
sudo dd if=/dev/urandom of=/dev/mem
/dev/mem
fiziksel belleğe, yani sistemdeki tüm RAM'e erişim sağlar, ancak bu RAM'e tam okuma / yazma erişimi sağladığınız anlamına gelmez ( bu belgedeki CONFIG_STRICT_DEVMEM seçeneğine bakın ). Ayrıca, fiziksel belleğin bazı bölgelerinin üzerine eşlenmiş video kartı hafızası vb. Gibi diğer cihazlara sahip olacağını unutmayın.
Kör olarak yazmak /dev/mem
belirsiz bir davranışla sonuçlanacak, işte aynı şeyi yapan bir youtube videosu.
İle test edin busybox devmem
busybox devmem
mmaps yapan küçük bir CLI yardımcı programıdır /dev/mem
.
Ubuntu'da şunlarla alabilirsiniz: sudo apt-get install busybox
Kullanımı: fiziksel adresinden 4 bayt oku 0x12345678
:
sudo busybox devmem 0x12345678
0x9abcdef0
Bu adrese yaz :
sudo busybox devmem 0x12345678 w 0x9abcdef0
Kaynak: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
MAP_SHARED
Eşleştirirken /dev/mem
, kullanmak isteyebilirsiniz:
open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)
MAP_SHARED
yazma işleminin hemen fiziksel belleğe gitmesini sağlar, bu da gözlemlenmesini kolaylaştırır ve donanım kayıt defteri yazmaları için daha anlamlı olur.
CONFIG_STRICT_DEVMEM
ve nopat
/dev/mem
V4.9 çekirdeğindeki normal RAM'i görüntülemek ve değiştirmek için kullanmak için yumruk atmalısınız:
CONFIG_STRICT_DEVMEM
(varsayılan olarak Ubuntu 17.04’te ayarlanmıştır)nopat
x86 çekirdek komut satırı seçeneğiG / Ç bağlantı noktaları hala bu olmadan çalışır.
Ayrıca bakınız: https://stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582
Önbellek kızarma
Bir kayıt yerine RAM'e yazmaya çalışırsanız, bellek CPU tarafından önbelleğe alınabilir: https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-adres-uzayda-linux ve onu yıkamak için veya bölgeyi önbellek olarak işaretlemek için çok taşınabilir / kolay bir yol görmüyorum:
Öyleyse belki /dev/mem
bellek tamponlarını cihazlara aktarmak için güvenilir bir şekilde kullanılamaz?
Bu, QEMU'da önbellek taklit etmediğinden maalesef gözlemlenemez.
Nasıl test edilir?
Şimdi eğlence kısmı için. İşte birkaç harika kurulum:
volatile
Bir userland işleminde değişken tahsis etme/proc/<pid>/maps
+ ile fiziksel adresi al/proc/<pid>/pagemap
devmem2
ve kullanıcı süreçlerinin tepki gösterdiğini izleyin:kmalloc
virt_to_phys
tekrar kullanıcıya gönderindevmem2
devmem2
kayıt defterine yazmak için kullanınprintf
yanıt olarak sanal cihazdan çıkanları izleyin/ dev / mem geleneksel olarak tüm fiziksel adres alanına erişim sağlar. Bu ram'ı içerir, fakat aynı zamanda herhangi bir hafıza eşlemeli IO cihazını da içerir.
Birçok modern çekirdek yalnızca / dev / mem'i hafıza ile eşleştirilen IO cihazlarına sınırlayan "CONFIG_STRICT_DEVMEM" ile yapılandırılacaktır.
Buna rastgele çöp yazmak kötü bir fikir ancak tam olarak ne kötülük olacağını tahmin etmek zor. Donanım rastgele çöplere öngörülemeyen yollarla yanıt verebilir, bozuk çekirdek bellek yapıları öngörülemeyen çekirdek davranışlarına neden olabilir. En iyi ihtimalle bir sistem çökmesini beklerdim, en kötü veri bozulmalarında ve hatta donanım tuğlalamalarında söz konusu olmaz.
PS, normal bir kullanıcı olarak çalıştırdığınızda komutunuzun hiçbir şey yapmaması gerektiğine dikkat edin, çünkü sudo yönlendirmeyi değil, yalnızca cat komutunu katlar.
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM