Імовірно, це якось пов’язано з пам’яттю? Що б
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>/pagemapdevmem2та спостерігати, як реагує процес користувача:kmallocvirt_to_physі передати її назад до userlanddevmem2devmem2для запису до реєстру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