/ Dev / mem nedir?


40

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?


2
Ayrıca bakınız:dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
user3490 9:12

6
Bellek koruması, bu RAM alanına atanmış olanlar dışındaki tüm işlemler için fiziksel RAM'e erişimi durdurmamalıdır? Yoksa sudo bu korumayı geçersiz kılıyor mu?
Matthew Lock,

Yanıtlar:


32

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! :-)


4
Mem man sayfasını gözden geçirmenizi öneririm. Paçavra doğru. "mem, bilgisayarın ana belleğinin bir görüntüsü olan bir karakter cihazı dosyasıdır. Örneğin, sistemi incelemek (ve hatta düzeltmek için) kullanılabilir. mem içindeki bayt adresleri fiziksel bellek adresleri olarak yorumlanır." Ve ... "kmem dosyası mem ile aynıdır, ancak fiziksel belleğe değil, çekirdek sanal belleğe erişilmesi dışında."
Bay Shickadance

@Andrew Flanagan: Bağlantınız şimdi time komutunu kullanarak bir kronometreyi nasıl ayarlayabileceğini gösteriyor.
Aiyion. Prime

1
Aiyion.Prime @. Teşekkürler - bir archive.org versiyonuna dikkat çekti.
Andrew Flanagan

19

/ 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.


9

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.


6

İ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:

  • devre dışı bırak CONFIG_STRICT_DEVMEM(varsayılan olarak Ubuntu 17.04’te ayarlanmıştır)
  • geçmesi nopatx86 çekirdek komut satırı seçeneği

G / Ç 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:

  • Kullanıcı alanı hafızası
    • volatileBir userland işleminde değişken tahsis etme
    • /proc/<pid>/maps+ ile fiziksel adresi al/proc/<pid>/pagemap
    • Fiziksel adres devmem2ve kullanıcı süreçlerinin tepki gösterdiğini izleyin:
  • Çekirdek hafızası
    • ile çekirdek belleği ayır kmalloc
    • fiziksel adresinizi alın ve virt_to_phystekrar kullanıcıya gönderin
    • ile fiziksel adresi değiştir devmem2
    • çekirdek modülündeki değeri sorgula
  • IO mem ve QEMU sanal platform cihazı
    • bilinen fiziksel sicil adreslerine sahip bir platform cihazı oluşturmak
    • devmem2kayıt defterine yazmak için kullanın
    • printfyanıt olarak sanal cihazdan çıkanları izleyin

5

/ 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.