Ошибка страницы возникает, когда доступ к памяти нарушается из-за того, что поиск MMU виртуального адреса заканчивается недействительным дескриптором или дескриптором, указывающим на отсутствие разрешений (например, попытка записи на страницу с разрешением только на чтение). Когда возникает ошибка страницы, процессор выполняет несколько действий; подробности специфичны для каждой процессорной архитектуры, но суть одна и та же:
Для примера, на (32-битном) процессоре ARM:
dfsr
установлен на значение, описывающее ошибку (была ли она вызвана чтением или записью, инструкцией процессора или DMA и т.д.). dfar
установлен на виртуальный адрес, который был целью доступа, вызвавшего ошибку. lr
установлен в счетчике программы в момент неисправности, а регистр spsr
установлен в регистре состояния программы (cpsr
, который содержит, среди прочего, биты режима) в момент неисправности. sp
и cpsr
имеют банк: они восстанавливаются из значения, последнего установленного в режиме прерывания. Код обработчика ошибок страницы является частью ядра операционной системы. Его задача - проанализировать причину ошибки и что-то предпринять. Он может обратиться к специализированным регистрам, которые предоставляют информацию о природе ошибки, а при необходимости может также проверить инструкцию, которую выполняла программа. Он также может просмотреть дескриптор в таблице MMU; недействительные дескрипторы иногда могут кодировать информацию, такую как расположение страницы в пространстве подкачки. Ядро знает, какая задача выполняется в данный момент, просматривая значение глобальной переменной или регистра, который оно обновляет на каждом переключателе контекста. Вот несколько распространённых поведений при ошибке страницы:
Вообще невозможно определить, что произойдет исключение, кроме как зная конфигурацию виртуальной памяти и делая проверки перед обращением к памяти. Нормальная работа заключается в том, что причина ошибки страницы записывается процессором, когда происходит ошибка страницы.
Эти настройки исчезают после каждой перезагрузки?
В случае программной перезагрузки, когда накопитель остается включенным, настройки не исчезают. Цикл питания сбрасывает параметр APM. (По крайней мере, на моем ноутбуке)
Большинство сеттеров также являются геттерами в hdparm
. Настройку APM можно легко проверить с помощью :
# hdparm -B /dev/sdb
/dev/sdb:
APM_level = 128
Это не работает для стенда -по таймеру. Но по логике эти настройки тоже теряются.
Куда я должен поместить эти команды, чтобы они были постоянными?
Все виды опций, пользовательское udev
правило, systemd
сервис, cron
задание(@reboot
). Что подходит вам лучше всего.
Arch wiki — неплохой источник дополнительной информации.
Вдохновленный приведенной выше вики, я создал systemd
служебный файл для своей системы Gentoo:
[Unit]
Description=hdparm sleep
After=suspend.target
[Service]
Type=oneshot
ExecStart=/sbin/hdparm -S 12 -B 127 /dev/sdb
[Install]
WantedBy=multi-user.target suspend.target
Вы можете захотеть применить настройки сразу ко всем своим устройствам следующим образом::
ExecStart=/sbin/hdparm -B 127 -S 241 /dev/sda /dev/sdb /dev/sdd /dev/sde
Обратите внимание, что вы должны использовать абсолютные пути для всего, вы не можете сделать, например. cmd /dev/sd[abde]
. Точное расположение двоичного файла hdparm
может отличаться в вашем дистрибутиве.
Используйте следующую команду, чтобы узнать местоположение вашего hdparm
, который обычно называется:
which hdparm
Затем вы можете включить службу и при необходимости запустить ее. Вы можете просто перезагрузить машину, чтобы убедиться, что она работает на 100%.
# systemctl enable hdparm.service
# systemctl start hdparm.service
# systemctl status hdparm.service
Предложение Arch подавляет вывод, но я предпочитаю проверять успешность hdparm
с помощью последней введенной команды.
Редактировать
Я обнаружил, что после приостановки параметры не сохраняются на моем жестком диске. Это может иметь место для большего количества портативных систем. Поэтому я изменил файл примера модуля. Предоставлено этому ответу на unix.SO.