Імовірно, це якось пов’язано з пам’яттю? Що б
sudo cat /dev/urandom > /dev/mem
робити? Сміти всю оперативну пам’ять? Уся віртуальна пам'ять без ядра? Жодні з вищезазначених?
Імовірно, це якось пов’язано з пам’яттю? Що б
sudo cat /dev/urandom > /dev/mem
робити? Сміти всю оперативну пам’ять? Уся віртуальна пам'ять без ядра? Жодні з вищезазначених?
Відповіді:
Він забезпечує доступ до фізичної пам'яті системи.
Сторінка mem(4)
man пояснює більше про те, що /dev/mem
таке.
Так - це може спричинити всілякі проблеми. Перезавантаження має виправити вас, але погані речі можуть статися дуже легко. Будь обережний! :-)
/ dev / mem забезпечує доступ до фізичної пам'яті системи, а не до віртуальної пам'яті. До віртуального простору адрес ядер можна отримати доступ за допомогою / dev / kmem.
В основному використовується для доступу до адрес пам'яті вводу-виводу, пов'язаних з периферійним обладнанням, як-от відеоадаптери.
sudo cat /dev/urandom > /dev/mem
нічого не зробиш, оскільки судо підвищить привілей кота, але не перенаправлення. Ви можете або робити, sudo su
і потім працювати в кореневій оболонці, або використовувати
sudo dd if=/dev/urandom of=/dev/mem
/dev/mem
забезпечує доступ до фізичної пам'яті, тобто всієї оперативної пам’яті в системі, однак це не означає, що вона дає вам повний доступ для читання / запису до оперативної пам’яті (див. опцію CONFIG_STRICT_DEVMEM в цьому документі). Також зауважте, що в деяких регіонах фізичної пам'яті будуть відображені інші пристрої, такі як пам'ять відеокарт тощо.
Якщо сліпо писати до, /dev/mem
це призведе до непевної поведінки, ось відео на YouTube, що робить те саме.
Перевірте це за допомогою 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
і передати її назад до userlanddevmem2
devmem2
для запису до реєструprintf
, як у відповідь виходять віртуальні пристрої/ dev / mem традиційно забезпечував доступ до всього фізичного адресного простору. Це включає в себе оперативну пам'ять, але вона також включає будь-які пристрої вводу-виводу, відображені на пам'яті.
Багато сучасних ядер буде налаштовано на "CONFIG_STRICT_DEVMEM", що обмежує / dev / mem лише на пам'яті, нанесені на IO-пристрої.
Написати на нього випадкове сміття - це погана ідея, але саме те, що відбудеться, буде важко передбачити. Обладнання може реагувати непередбачуваними способами на випадкове сміття, пошкоджені структури пам'яті ядра можуть спричинити непередбачувану поведінку ядра. У кращому випадку я б очікував збоїв у системі, в гіршому випадку пошкодження даних або навіть апаратне гальмування не підлягають сумніву.
PS зауважте, що ваша команда при запуску як звичайний користувач нічого не повинна робити, тому що sudo розробляє лише команду cat, а не перенаправлення.
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM