Очистка ОЗУ перед выключением. Как Linux выделяет память? - PullRequest
0 голосов
/ 06 марта 2012

Я знаю, что многие люди думают, что стирание ОЗУ при выключении довольно бессмысленно, я провел немало исследований о преимуществах и недостатках (и если это действительно того стоит).Таким образом, в самом хорошем политическом из возможных способов ... пожалуйста, никаких комментариев, таких как "Почему вы хотите стереть Ram, его бессмысленно"

Я попытался DD / dev / mem и, как и ожидалось, DD выдал ошибкуи ядро ​​предупредило, что DD пытался получить доступ к памяти между 101000 и 101200. Поэтому мой вопрос ... Как распределяется память в Linux и, точнее, существует ли какая-либо личная информация между адресами 101000 и 101200 или она полностью зарезервирована / защищена дляядро?

Заранее спасибо

Том

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Поскольку вы не предоставили никаких сведений, я предполагаю, что вы используете довольно свежую версию ядра, работающую на x86.

Документация по Linux предоставляет структуру физической памяти после загрузки. Там видно, что ядро ​​загружено по адресу 0x100000. Это означает, что в регионе, о котором вы спрашиваете (0x101000 - 0x101200), есть только код ядра.

Физическая память распределяется в страницах с использованием двоичного распределителя контактов. Это описано гораздо подробнее здесь .

Однако очистка физической памяти с использованием чего-либо, кроме кода ядра, невозможна и может быть опасной (повреждение данных на дисках). Если вы действительно хотите стереть ОЗУ при выключении, я бы предложил взломать ядро.

0 голосов
/ 16 февраля 2014

Чтобы стереть физическую память в меру своих возможностей (вы упомянули dd, так что мы говорим о пользовательском решении!), Достаточно создать анонимное отображение того же размера, что и установленное ОЗУ 1 и прикоснуться к каждой странице, записав один байт (или любое другое количество) на один адрес внутри каждой страницы.

Это вызовет сбой страницы и вызовет операцию копирования при записи на нулевой странице для каждой страницы в вашем отображении, к которой вы прикоснулись, что приведет к фиксации уже обнуленной страницы или обнулению неиспользованной ненулевой физической страницы память - до тех пор, пока не останется ни одного, и в этот момент ваш процесс будет убит убийцей OOM (или получит SIGBUS, в зависимости от того, какой из них ударит по вашему процессу первым).
Если вы хотите, чтобы это было несколько «чище» (то есть без OOM killer), вам нужно остановиться, прежде чем дотронуться до последней страницы, очевидно. Но в целом это все, что нужно.

Вы не сможете стереть все физические страницы, как это, но на самом деле не существует способа сделать это с пользовательским процессом (не без свопа и не в детерминированном путь). Страницы, которые зафиксированы другими процессами, или страницы, принадлежащие ядру, не могут быть перезаписаны с этим подходом, по крайней мере, не надежно (так как нет подкачки, их нельзя заменить, хотя вы может повезет, и OOM убьет другие процессы вместо ваших).
Обычно вы не можете перезаписать физическую память на 100% надежным способом, если не замените работающее ядро.

Если вы хотите быть очень «тщательным», то единственный вариант - написать код, который можно найти, например, например. в memtest_x86, который вы вызываете из режима ядра, замените работающее ядро ​​и перезапишите сырую физическую память «трудным путем», так же, как и memtest_x86.

Но тогда, если вы пойдете по ультра-паранойной дороге, не забудьте очистить память GPU, а также очистить кеш жесткого диска и память сетевой карты ...


1 На самом деле вам нужно будет создать отображение размера максимального размера фиксации - но вы заявили, что подкачки нет, поэтому подойдет «размер ОЗУ». Видя, как современные дисководы выполняют обширные выравнивания износа, перезапись подкачки в любом случае не очень поможет, но, по крайней мере, вы можете гарантировать, что попадете на все страницы ОЗУ, если зафиксировали максимальный размер фиксации.
...