Отключение всех прерываний для защиты состояния регистра ЦП в многопроцессорных системах - PullRequest
4 голосов
/ 09 февраля 2011

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

  • Есть ли способ отключить ВСЕ прерывания от ВСЕХ процессоров во время секции кода (например, с помощью механизма спин-блокировки)?

  • Это необходимо?Я полагаю, что при изменении регистра cr0 в многопроцессорной системе регистр изменяется только для текущего процессора?-> так что отключения прерываний только для текущего процессора будет достаточно?-> Есть ли способ проверить / изменить из других процессоров (в той же системе) регистр из другого процессора?

Большое спасибо за ваши ответы (и извините за мойприблизительный английский)

Jérôme.

Ответы [ 2 ]

1 голос
/ 09 февраля 2011

Жером,

Вы изучали использование spin_lock_irqsave() и spin_unlock_irqrestore()? Это отключает локальные прерывания.

Я считаю, что более всеобъемлющей версией является spin_lock_irq() и spin_unlock_irq(), которая безоговорочно останавливает все прерывания (например, cli()/sti()).

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

Удачи!

0 голосов
/ 10 февраля 2011

Вы задали много вопросов, я постараюсь ответить на них по порядку:

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

Чтобы изменить регистр, вам обычно не нужно выполнять какую-либо блокировку, вы можете изменить регистр атомарно. Если вы хотите изменить регистр, сделать что-то, а затем изменить регистр обратно, вам может потребоваться отключить прерывания вокруг этой последовательности.

Как правило, нет возможности увидеть регистры другого процессора в системе. Ядро делает это, чтобы попросить другой процессор сохранить свои регистры в памяти.

Следует опасаться, что на современных процессорах некоторые регистры могут быть на ядро, т.е. общий для нескольких потоков в ядре.

Наконец, я предполагаю, что вы говорите о CR0 на x86. Это не похоже на изменение какого-либо старого регистра, вам нужно действительно знать, что вы делаете: -)

...