2016-06-29 4 views
1

Я немного смущен относительно того, что представляет собой прерывание в ядре Linux. Насколько я понимаю, spin_lock_irqsave()/spin_lock_irqrestore() гарантирует, что мой критический раздел не будет выгружен обработчиком прерываний. Справедливо.В ядре Linux функция spin_lock_irqsave() защищает меня от обработчиков сигналов, ошибок страниц, вызовов в schedule()?

Но я немного смущен тем, что представляет собой обработчик прерываний. Во-первых, я не уверен на 100%, что я также защищен от выкупа из softirqs. Это так?

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

Как насчет обработчиков сигналов? Я не понимаю, как это реализовано. Что делать, если я посылаю сигнал SIGTERM, SIGINT или SIGKILL? Это реализовано с мягким IRQ? что-то другое? Может ли такой сигнал вытеснить мой критический раздел, когда я использую spin_lock_irqsave()? Или совсем не потому, что эти сигналы обрабатываются исключительно в пользовательском пространстве?

Как насчет звонков по расписанию()? Могут ли они упредить меня в любое время, даже в моих критических разделах, когда я использую spin_lock_irqsave()?

Я думаю, что я действительно хотел бы знать, что именно может упредить меня, когда я использую spin_lock_irqsave(). Никто, кто использует тот же замок, что и я, и никаких обработчиков прерываний. Как насчет всех этих вещей? Что относительно softirqs/tasklets/рабочих очередей?

И, наконец, spin_lock_irqsave() сильнее, чем spin_lock_bh()? I.e., does spin_lock_irqsave() предотвращает изъятие из нижних половин (т. Е. Softirqs, tasklets и рабочих очередей)?

Я все это немного искал, но мне трудно найти четкие ответы.

ответ

3

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

Прерывание - это сигнал от внешнего устройства, указывающий, что ему нужно внимание. Аппаратное обеспечение ЦП поддерживает механизм, позволяющий автоматически передавать управление «обработчику прерываний» при утверждении сигнала прерывания (но это может быть временно замаскировано, что и делает spin_lock_irqsave).

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

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

Аналогичным образом, вы не можете позвонить по телефону schedule, в то время как вы держите блокировку вращения, потому что ...

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

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

См. Также эту статью. Конкретные детали, вероятно, устарели, но все концепции остаются в силе. https://www.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/