Насколько я понимаю, если в обработчике прерываний есть какие-то данные, которые используются совместно с другим процессом, то они должны быть защищены с помощью спин-блокировки, также нам нужно отключить локальное прерывание. Но что, если данные распределяются между несколькими обработчиками прерываний, как я могу их защитить?
Как защитить данные, совместно используемые несколькими обработчиками прерываний в ядре Linux?
Ответы (2)
Всякий раз, когда есть critical section
(CS
), который можно запустить в interrupt context
, вы используете spinlock
для его защиты, не имеет значения, используется ли CS
совместно между interrupt handler
и process
или между interrupt handlers
.
Причина, по которой вы не используете semaphore
или mutex
, очевидна, потому что вы не можете спать в interrupt context
.
person
brokenfoot
schedule
09.04.2014
вы правы, я должен использовать спинлок. Но что я действительно хочу знать, так это действительно ли он защищает данные, когда данные распределяются между несколькими обработчиками прерываний?
- person Rahul; 09.04.2014
Вот почему вы отключаете локальные прерывания. Когда прерывание выполняется, все прерывания, использующие эту линию IRQ, игнорируются. И если (гипотетический случай) другой обработчик прерывания с высоким приоритетом вытеснит этот обработчик прерывания, пока он удерживает спин-блокировку, это приведет к взаимоблокировке. Следовательно, этого никогда не происходит.
- person brokenfoot; 09.04.2014
Обработчики прерываний не могут быть вытеснены и не допускают повторного входа, поэтому нет возможности одновременного доступа к данным.
person
Gyan Gupta
schedule
09.04.2014
как насчет того, когда вы делитесь прерываниями с помощью IRQ_SHARE?
- person chandank; 09.04.2014
Вы имеете в виду совместное использование линий IRQ, указав SA_SHIRQ?
- person Gyan Gupta; 09.04.2014
да. Я видел код, в котором они используют некоторые другие параметры, чтобы определить, является ли это правильным обработчиком прерываний, таким как имя разработчика и т. д.
- person chandank; 10.04.2014
Я полагаю, это будет зависеть от типа nvic. Прерывания могут и будут вытеснять друг друга, если сконфигурированы с разными приоритетами.
- person Martin; 11.12.2017