Как защитить данные, совместно используемые несколькими обработчиками прерываний в ядре Linux?

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


person Rahul    schedule 09.04.2014    source источник


Ответы (2)


Всякий раз, когда есть critical section (CS), который можно запустить в interrupt context, вы используете spinlock для его защиты, не имеет значения, используется ли CS совместно между interrupt handler и process или между interrupt handlers.

Причина, по которой вы не используете semaphore или mutex, очевидна, потому что вы не можете спать в interrupt context.

person brokenfoot    schedule 09.04.2014
comment
вы правы, я должен использовать спинлок. Но что я действительно хочу знать, так это действительно ли он защищает данные, когда данные распределяются между несколькими обработчиками прерываний? - person Rahul; 09.04.2014
comment
Вот почему вы отключаете локальные прерывания. Когда прерывание выполняется, все прерывания, использующие эту линию IRQ, игнорируются. И если (гипотетический случай) другой обработчик прерывания с высоким приоритетом вытеснит этот обработчик прерывания, пока он удерживает спин-блокировку, это приведет к взаимоблокировке. Следовательно, этого никогда не происходит. - person brokenfoot; 09.04.2014

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

person Gyan Gupta    schedule 09.04.2014
comment
как насчет того, когда вы делитесь прерываниями с помощью IRQ_SHARE? - person chandank; 09.04.2014
comment
Вы имеете в виду совместное использование линий IRQ, указав SA_SHIRQ? - person Gyan Gupta; 09.04.2014
comment
да. Я видел код, в котором они используют некоторые другие параметры, чтобы определить, является ли это правильным обработчиком прерываний, таким как имя разработчика и т. д. - person chandank; 10.04.2014
comment
Я полагаю, это будет зависеть от типа nvic. Прерывания могут и будут вытеснять друг друга, если сконфигурированы с разными приоритетами. - person Martin; 11.12.2017