Разве защита памяти не должна останавливать доступ к физической памяти для всех процессов, кроме той, которая была назначена этой области памяти? Или sudo отменяет эту защиту?
Мэтью Лок
Ответы:
32
Он обеспечивает доступ к физической памяти системы.
Страница mem(4)man объясняет больше о том, что /dev/memесть.
Да, это может вызвать все виды проблем. Перезагрузка должна исправить вас, но плохие вещи могут произойти очень легко. Быть осторожен! :-)
Я бы предложил просмотреть справочную страницу mem. Тряпки это правильно. «mem - это файл символьного устройства, представляющий собой образ основной памяти компьютера. Он может использоваться, например, для проверки (и даже исправления) системы. Адреса байтов в mem интерпретируются как адреса физической памяти». И ... «Файл kmem такой же, как mem, за исключением того, что доступ к виртуальной памяти ядра, а не к физической памяти».
Мистер Шикаданс
@ Андрей Фланаган: Ваша ссылка теперь показывает, как можно настроить секундомер с помощью команды времени.
Aiyion.Prime
1
@ Aiyion.Prime. Спасибо - указал на версию archive.org.
Андрей Фланаган,
19
/ dev / mem предоставляет доступ к физической памяти системы, а не к виртуальной памяти. Виртуальное адресное пространство ядра может быть доступно с помощью / dev / kmem.
Он в основном используется для доступа к адресам памяти ввода-вывода, связанным с периферийным оборудованием, например видеоадаптерами.
sudo cat /dev/urandom > /dev/memничего не сделает, так как sudo повысит привилегию cat, но не редиректа. Вы можете либо сделать sudo suи затем работать в корневой оболочке, либо использовать sudo dd if=/dev/urandom of=/dev/mem
/dev/memобеспечивает доступ к физической памяти, т. е. ко всей оперативной памяти в системе, однако это не означает, что он дает вам полный доступ для чтения / записи в оперативную память (см. параметр CONFIG_STRICT_DEVMEM в этом документе). Также обратите внимание, что в некоторых областях физической памяти будут отображаться другие устройства, такие как память видеокарты и т. Д.
Слепое написание /dev/memприведет к неопределенному поведению, вот видео на YouTube, делающее то же самое.
/ dev / mem традиционно предоставляет доступ ко всему физическому адресному пространству. Это включает в себя оперативную память, но также включает любые устройства ввода-вывода с отображением в памяти.
Многие современные ядра будут сконфигурированы с «CONFIG_STRICT_DEVMEM», который ограничивает / dev / mem только для устройств ввода-вывода с отображением в памяти.
Писать случайный мусор - плохая идея, но точно, что случится, сложно предугадать. Аппаратные средства могут непредсказуемым образом реагировать на случайный мусор, поврежденные структуры памяти ядра могут вызывать непредсказуемое поведение ядра. В лучшем случае я бы ожидал сбой системы, в худшем случае не может быть и речи о повреждении данных или даже аппаратном блокировании.
PS обратите внимание, что ваша команда при запуске от имени обычного пользователя не должна ничего делать, потому что sudo уничтожает только команду cat, а не redirect.
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
Ответы:
Он обеспечивает доступ к физической памяти системы.
Страница
mem(4)
man объясняет больше о том, что/dev/mem
есть.Да, это может вызвать все виды проблем. Перезагрузка должна исправить вас, но плохие вещи могут произойти очень легко. Быть осторожен! :-)
источник
/ dev / mem предоставляет доступ к физической памяти системы, а не к виртуальной памяти. Виртуальное адресное пространство ядра может быть доступно с помощью / dev / kmem.
Он в основном используется для доступа к адресам памяти ввода-вывода, связанным с периферийным оборудованием, например видеоадаптерами.
источник
sudo cat /dev/urandom > /dev/mem
ничего не сделает, так как sudo повысит привилегию cat, но не редиректа. Вы можете либо сделатьsudo su
и затем работать в корневой оболочке, либо использоватьsudo dd if=/dev/urandom of=/dev/mem
/dev/mem
обеспечивает доступ к физической памяти, т. е. ко всей оперативной памяти в системе, однако это не означает, что он дает вам полный доступ для чтения / записи в оперативную память (см. параметр CONFIG_STRICT_DEVMEM в этом документе). Также обратите внимание, что в некоторых областях физической памяти будут отображаться другие устройства, такие как память видеокарты и т. Д.Слепое написание
/dev/mem
приведет к неопределенному поведению, вот видео на YouTube, делающее то же самое.источник
Проверьте это с
busybox devmem
busybox devmem
это крошечная утилита CLI, которая mmaps/dev/mem
.Вы можете получить его в Ubuntu с помощью:
sudo apt-get install busybox
Использование: прочитать 4 байта с физического адреса
0x12345678
:Пишите
0x9abcdef0
по этому адресу:Источник: https://github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
MAP_SHARED
Когда mmapping
/dev/mem
, вы, вероятно, хотите использовать:MAP_SHARED
заставляет записи идти в физическую память немедленно, что облегчает наблюдение и имеет больше смысла для аппаратной записи в регистр.CONFIG_STRICT_DEVMEM
а такжеnopat
Чтобы использовать
/dev/mem
для просмотра и изменения обычной оперативной памяти в ядре v4.9, вы должны:CONFIG_STRICT_DEVMEM
(установлено по умолчанию в Ubuntu 17.04)nopat
командной строки ядра для x86Порты ввода-вывода по-прежнему работают без них.
Смотрите также: 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
и передать его обратно пользователюdevmem2
devmem2
для записи в реестрprintf
выходят из виртуального устройства в ответисточник
/ dev / mem традиционно предоставляет доступ ко всему физическому адресному пространству. Это включает в себя оперативную память, но также включает любые устройства ввода-вывода с отображением в памяти.
Многие современные ядра будут сконфигурированы с «CONFIG_STRICT_DEVMEM», который ограничивает / dev / mem только для устройств ввода-вывода с отображением в памяти.
Писать случайный мусор - плохая идея, но точно, что случится, сложно предугадать. Аппаратные средства могут непредсказуемым образом реагировать на случайный мусор, поврежденные структуры памяти ядра могут вызывать непредсказуемое поведение ядра. В лучшем случае я бы ожидал сбой системы, в худшем случае не может быть и речи о повреждении данных или даже аппаратном блокировании.
PS обратите внимание, что ваша команда при запуске от имени обычного пользователя не должна ничего делать, потому что sudo уничтожает только команду cat, а не redirect.
источник