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/memolduğ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/membir şey yapmayacak, çünkü sudo kedinin imtiyazını yükseltecek, ancak yönlendirme değil. Ya yapabilirsiniz sudo suve kök kabuğunda sonra çalışma veya kullanım
sudo dd if=/dev/urandom of=/dev/mem
/dev/memfiziksel 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/membelirsiz bir davranışla sonuçlanacak, işte aynı şeyi yapan bir youtube videosu.
İle test edin busybox devmem
busybox devmemmmaps 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
0x9abcdef0Bu 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/memV4.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)nopatx86 ç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/membellek 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:
volatileBir userland işleminde değişken tahsis etme/proc/<pid>/maps+ ile fiziksel adresi al/proc/<pid>/pagemapdevmem2ve kullanıcı süreçlerinin tepki gösterdiğini izleyin:kmallocvirt_to_phystekrar kullanıcıya gönderindevmem2devmem2kayıt defterine yazmak için kullanınprintfyanı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