Що таке / dev / mem?


40

Імовірно, це якось пов’язано з пам’яттю? Що б

sudo cat /dev/urandom > /dev/mem

робити? Сміти всю оперативну пам’ять? Уся віртуальна пам'ять без ядра? Жодні з вищезазначених?


2
Дивіться також:dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
user3490

6
Чи не повинен захист пам’яті зупиняти доступ до фізичної оперативної пам’яті для всіх процесів, крім того, який був призначений для цієї області ОЗУ? Або судо перекриває цей захист?
Меттью Лок

Відповіді:


32

Він забезпечує доступ до фізичної пам'яті системи.

Сторінка mem(4)man пояснює більше про те, що /dev/memтаке.

Так - це може спричинити всілякі проблеми. Перезавантаження має виправити вас, але погані речі можуть статися дуже легко. Будь обережний! :-)


4
Я б запропонував переглянути сторінку чоловіка. Лахміття правильно. "mem - файл символьного пристрою, який є зображенням основної пам'яті комп'ютера. Він може використовуватися, наприклад, для дослідження (і навіть виправлення) системи. Байт-адреси в mem інтерпретуються як фізичні адреси пам'яті." І ... "Файл kmem такий же, як mem, за винятком того, що доступ до віртуальної пам'яті ядра, а не фізичної пам'яті".
Містер Шикаданс

@Andrew Flanagan: Ваше посилання тепер показує, як можна встановити секундомір за допомогою команди time.
Aiyion.Prime

1
@ Aiyion.Prime. Дякую - вказав на версію archive.org.
Ендрю Фланаган

19

/ dev / mem забезпечує доступ до фізичної пам'яті системи, а не до віртуальної пам'яті. До віртуального простору адрес ядер можна отримати доступ за допомогою / dev / kmem.

В основному використовується для доступу до адрес пам'яті вводу-виводу, пов'язаних з периферійним обладнанням, як-от відеоадаптери.


9

sudo cat /dev/urandom > /dev/memнічого не зробиш, оскільки судо підвищить привілей кота, але не перенаправлення. Ви можете або робити, sudo suі потім працювати в кореневій оболонці, або використовувати
sudo dd if=/dev/urandom of=/dev/mem

/dev/memзабезпечує доступ до фізичної пам'яті, тобто всієї оперативної пам’яті в системі, однак це не означає, що вона дає вам повний доступ для читання / запису до оперативної пам’яті (див. опцію CONFIG_STRICT_DEVMEM в цьому документі). Також зауважте, що в деяких регіонах фізичної пам'яті будуть відображені інші пристрої, такі як пам'ять відеокарт тощо.

Якщо сліпо писати до, /dev/memце призведе до непевної поведінки, ось відео на YouTube, що робить те саме.


7

Перевірте це за допомогою busybox devmem

busybox devmemце крихітна утиліта CLI, яка створює карти /dev/mem.

Ви можете отримати його в Ubuntu за допомогою: sudo apt-get install busybox

Використання: прочитати 4 байти з фізичної адреси 0x12345678:

sudo busybox devmem 0x12345678

Напишіть 0x9abcdef0на цю адресу:

sudo busybox devmem 0x12345678 w 0x9abcdef0

Джерело: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85

MAP_SHARED

Під час картування /dev/memви, ймовірно, захочете використовувати:

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

MAP_SHARED змушує записи негайно переходити до фізичної пам'яті, що полегшує спостереження та має більше сенсу для апаратних записів реєстру.

CONFIG_STRICT_DEVMEM і nopat

Щоб /dev/memпереглядати та змінювати звичайну оперативну пам’ять на ядрі v4.9, потрібно кулак:

  • вимкнути CONFIG_STRICT_DEVMEM(встановлено за замовчуванням на Ubuntu 17.04)
  • передайте параметр nopatкомандного рядка ядра для x86

Порти IO як і раніше працюють без них.

Дивіться також: https://stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582

Промивання кешу

Якщо ви спробуєте записати в оперативну пам'ять замість регістра, пам'ять може кешуватися процесором: https://stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-address-space-in-linux, і я не бачу дуже портативного / простого способу його очистити або позначити регіон як неможливий для керування:

То, може, /dev/memне можна надійно використовувати для передачі буферів пам'яті на пристрої?

На жаль, це не спостерігається в QEMU, оскільки QEMU не імітує кеші.

Як це перевірити

Тепер для веселої частини. Ось кілька цікавих налаштувань:

  • Пам'ять користувача
    • виділити volatileзмінну в процесі користувача
    • отримати фізичну адресу за допомогою /proc/<pid>/maps+/proc/<pid>/pagemap
    • фізична адреса devmem2та спостерігати, як реагує процес користувача:
  • Пам'ять Кернелленда
    • виділити пам'ять ядра за допомогою kmalloc
    • отримати фізичну адресу virt_to_physі передати її назад до userland
    • змінити фізичну адресу за допомогою devmem2
    • запитувати значення з модуля ядра
  • Пристрій IO і віртуальна платформа QEMU
    • створити пристрій платформи з відомими фізичними адресами реєстру
    • використовувати devmem2для запису до реєстру
    • спостерігати printf, як у відповідь виходять віртуальні пристрої

5

/ dev / mem традиційно забезпечував доступ до всього фізичного адресного простору. Це включає в себе оперативну пам'ять, але вона також включає будь-які пристрої вводу-виводу, відображені на пам'яті.

Багато сучасних ядер буде налаштовано на "CONFIG_STRICT_DEVMEM", що обмежує / dev / mem лише на пам'яті, нанесені на IO-пристрої.

Написати на нього випадкове сміття - це погана ідея, але саме те, що відбудеться, буде важко передбачити. Обладнання може реагувати непередбачуваними способами на випадкове сміття, пошкоджені структури пам'яті ядра можуть спричинити непередбачувану поведінку ядра. У кращому випадку я б очікував збоїв у системі, в гіршому випадку пошкодження даних або навіть апаратне гальмування не підлягають сумніву.

PS зауважте, що ваша команда при запуску як звичайний користувач нічого не повинна робити, тому що sudo розробляє лише команду cat, а не перенаправлення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.