Настройки простоя жесткого диска с использованием hdparm (APM, Suspend)

Ошибка страницы возникает, когда доступ к памяти нарушается из-за того, что поиск MMU виртуального адреса заканчивается недействительным дескриптором или дескриптором, указывающим на отсутствие разрешений (например, попытка записи на страницу с разрешением только на чтение). Когда возникает ошибка страницы, процессор выполняет несколько действий; подробности специфичны для каждой процессорной архитектуры, но суть одна и та же:

  • Переход в привилегированный режим (например, режим ядра).
  • Установите некоторые регистры, чтобы указать, по крайней мере, на характер неисправности, а также счетчик программы и режим процессора в месте неисправности.
  • Перейти по определённому адресу в памяти, указанному регистром или самому посмотреть на определённое место в памяти: адрес обработчика ошибок страницы.

Для примера, на (32-битном) процессоре ARM:

  • Регистр dfsr установлен на значение, описывающее ошибку (была ли она вызвана чтением или записью, инструкцией процессора или DMA и т.д.).
  • Регистр dfar установлен на виртуальный адрес, который был целью доступа, вызвавшего ошибку.
  • Процессор переключается в режим прерывания (один из привилегированных режимов на уровне ядра ).
  • Регистр lr установлен в счетчике программы в момент неисправности, а регистр spsr установлен в регистре состояния программы (cpsr, который содержит, среди прочего, биты режима) в момент неисправности.
  • Регистры sp и cpsr имеют банк: они восстанавливаются из значения, последнего установленного в режиме прерывания.
  • Выполнение переходит в вектор прерывания, один из векторов исключений .

Код обработчика ошибок страницы является частью ядра операционной системы. Его задача - проанализировать причину ошибки и что-то предпринять. Он может обратиться к специализированным регистрам, которые предоставляют информацию о природе ошибки, а при необходимости может также проверить инструкцию, которую выполняла программа. Он также может просмотреть дескриптор в таблице MMU; недействительные дескрипторы иногда могут кодировать информацию, такую как расположение страницы в пространстве подкачки. Ядро знает, какая задача выполняется в данный момент, просматривая значение глобальной переменной или регистра, который оно обновляет на каждом переключателе контекста. Вот несколько распространённых поведений при ошибке страницы:

  • Данные о связках в памяти процесса указывают на то, что страница находится в подкачке. Ядро находит свободную физическую страницу, или получает ее, удаляя страницу, содержащую кэш на диске, или получает страницу, сохраняя ее содержимое для подкачки. Затем оно загружает данные из подкачки на эту физическую страницу и изменяет таблицу MMU таким образом, что виртуальный адрес, который вызвал ошибку, теперь прикреплен к этой физической странице в карте MMU процесса. Наконец, ядро организует переключение обратно в процесс в точке команды, которая вызвала ошибку; на этот раз команда будет успешно выполнена.
  • Данные о отображении памяти процесса указывают на то, что эта страница является копией страницы на запись, и была предпринята попытка доступа на запись. Скорее, как и в предыдущем случае, ядро получает свободную физическую страницу, копирует на нее данные (здесь, со страницы, которая была доступна только для чтения), изменяет дескриптор MMU и организует повторное выполнение команды процессом.
  • Данные о сопоставлении памяти процесса указывают на то, что страница не сопоставлена, или что у нее нет необходимых разрешений. В этом случае ядро доставляет процессу сигнал SIGSEGV (ошибка сегментации): выполнение процесса возобновляется на обработчике сигнала, а не на исходном месте, но исходное место сохраняется в стеке. Если процесс не имеет обработчика SIGSEGV, он завершается.

Вообще невозможно определить, что произойдет исключение, кроме как зная конфигурацию виртуальной памяти и делая проверки перед обращением к памяти. Нормальная работа заключается в том, что причина ошибки страницы записывается процессором, когда происходит ошибка страницы.

3
17.04.2018, 08:50
1 ответ

Эти настройки исчезают после каждой перезагрузки?

В случае программной перезагрузки, когда накопитель остается включенным, настройки не исчезают. Цикл питания сбрасывает параметр 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.

4
27.01.2020, 21:25

Теги

Похожие вопросы