Я немного смущен относительно того, что представляет собой прерывание в ядре 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 и рабочих очередей)?
Я все это немного искал, но мне трудно найти четкие ответы.