Apa itu / dev / mem?

40

Mungkin ini terkait dengan memori? Apa yang akan

sudo cat /dev/urandom > /dev/mem

melakukan? Buang semua RAM? Semua memori virtual non-kernel? Bukan dari salah satu di atas?

Cfinley
sumber
2
Lihat juga:dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
user3490
6
Tidakkah perlindungan memori menghentikan akses ke RAM fisik untuk semua proses kecuali yang telah ditetapkan untuk area RAM itu? Atau apakah sudo mengesampingkan perlindungan itu?
Matthew Lock

Jawaban:

32

Ini memberikan akses ke memori fisik sistem.

The mem(4)halaman manual menjelaskan lebih lanjut tentang apa /dev/memyang.

Ya - itu bisa menyebabkan berbagai masalah. Reboot akan memperbaiki Anda, tetapi hal-hal buruk dapat terjadi dengan sangat mudah. Hati-hati! :-)

Andrew Flanagan
sumber
4
Saya sarankan meninjau halaman mem mem. Kain benar. "mem adalah file perangkat karakter yang merupakan gambar dari memori utama komputer. Ini dapat digunakan, misalnya, untuk memeriksa (dan bahkan menambal) sistem. Alamat byte dalam mem diartikan sebagai alamat memori fisik." Dan ... "File kmem sama dengan mem, kecuali bahwa memori virtual kernel daripada memori fisik diakses."
Tn. Shickadance
@Andrew Flanagan: Tautan Anda sekarang menunjukkan bagaimana seseorang dapat mengatur stopwatch menggunakan perintah waktu.
Aiyion.Prime
1
@ Aiyion.Prime. Terima kasih - menunjuk ke versi archive.org.
Andrew Flanagan
19

/ dev / mem menyediakan akses ke memori fisik sistem , bukan memori virtual. Ruang alamat virtual kernel dapat diakses menggunakan / dev / kmem.

Ini terutama digunakan untuk mengakses alamat memori IO yang terkait dengan perangkat keras periferal, seperti adapter video.

kain
sumber
9

sudo cat /dev/urandom > /dev/memtidak akan melakukan apa-apa, karena sudo akan meningkatkan hak istimewa kucing tetapi tidak dari pengalihan. Anda dapat melakukannya sudo sudan kemudian bekerja di shell root, atau gunakan
sudo dd if=/dev/urandom of=/dev/mem

/dev/memmenyediakan akses ke memori fisik, yaitu semua RAM dalam sistem, namun ini tidak berarti bahwa itu memberi Anda akses baca / tulis penuh ke RAM (lihat opsi CONFIG_STRICT_DEVMEM dalam dokumen ini ). Perhatikan juga bahwa beberapa wilayah memori fisik akan memiliki perangkat lain seperti memori kartu video, dll. Yang dipetakan di atasnya.

Menulis secara membabi buta /dev/memakan mengakibatkan perilaku yang tidak pasti, di sini adalah video youtube melakukan hal yang sama.

Sahil Singh
sumber
7

Uji dengan busybox devmem

busybox devmemadalah utilitas CLI kecil yang mmaps /dev/mem.

Anda bisa mendapatkannya di Ubuntu dengan: sudo apt-get install busybox

Penggunaan: baca 4 byte dari alamat fisik 0x12345678:

sudo busybox devmem 0x12345678

Tulis 0x9abcdef0ke alamat itu:

sudo busybox devmem 0x12345678 w 0x9abcdef0

Sumber: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85

MAP_SHARED

Saat mmapping /dev/mem, Anda mungkin ingin menggunakan:

open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)

MAP_SHARED membuat write masuk ke memori fisik segera, yang membuatnya lebih mudah untuk diamati, dan lebih masuk akal untuk hardware register menulis.

CONFIG_STRICT_DEVMEM dan nopat

Untuk menggunakan /dev/memuntuk melihat dan memodifikasi RAM reguler pada kernel v4.9, Anda harus mengepal:

  • nonaktifkan CONFIG_STRICT_DEVMEM(ditetapkan secara default pada Ubuntu 17.04)
  • lulus nopatopsi baris perintah kernel untuk x86

Port IO masih berfungsi tanpa itu.

Lihat juga: https://stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582

Cache memerah

Jika Anda mencoba menulis ke RAM alih-alih register, memori dapat di-cache oleh CPU: https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-address-space-in-linux dan saya tidak melihat cara yang sangat portabel / mudah untuk menyiramnya atau menandainya sebagai tidak dapat di-cache:

Jadi mungkin /dev/memtidak dapat digunakan secara andal untuk meneruskan buffer memori ke perangkat?

Sayangnya, ini tidak dapat diamati dalam QEMU, karena QEMU tidak mensimulasikan cache.

Cara mengujinya

Sekarang untuk bagian yang menyenangkan. Berikut ini beberapa pengaturan keren:

  • Memori Userland
    • mengalokasikan volatilevariabel pada proses userland
    • dapatkan alamat fisik dengan /proc/<pid>/maps+/proc/<pid>/pagemap
    • alamat fisik dengan devmem2, dan perhatikan proses userland bereaksi:
  • Memori kernel
    • mengalokasikan memori kernel dengan kmalloc
    • dapatkan alamat fisik virt_to_physdan kirimkan kembali ke userland
    • ubah alamat fisik dengan devmem2
    • meminta nilai dari modul kernel
  • IO mem dan perangkat platform virtual QEMU
    • buat perangkat platform dengan alamat register fisik yang dikenal
    • gunakan devmem2untuk menulis ke register
    • arloji printfkeluar dari perangkat virtual sebagai tanggapan
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
5

/ dev / mem secara tradisional menyediakan akses ke seluruh ruang alamat fisik. Itu termasuk ram tetapi juga mencakup perangkat IO yang dipetakan memori.

Banyak kernel modern akan dikonfigurasikan dengan "CONFIG_STRICT_DEVMEM" yang membatasi / dev / mem hanya ke perangkat IO yang dipetakan di memori.

Menulis sampah secara acak adalah ide yang buruk, tetapi persis apa yang akan terjadi adalah sulit untuk diprediksi. Perangkat keras dapat merespons dengan cara yang tidak terduga terhadap sampah acak, struktur memori kernel yang rusak dapat menyebabkan perilaku kernel yang tidak dapat diprediksi. Paling-paling saya akan mengharapkan sistem crash, korupsi data terburuk atau bahkan bricking perangkat keras tidak keluar dari pertanyaan.

PS perhatikan bahwa perintah Anda ketika dijalankan sebagai pengguna biasa seharusnya tidak melakukan apa-apa, karena sudo hanya menghilangkan perintah cat, bukan redirect.

plugwash
sumber