#linux #linux-kernel #spinlock #fiq
#linux #linux-ядро #блокировка вращения #ошибка
Вопрос:
Я пишу драйвер устройства Linux, и мне нужно сериализовать доступ к критическим разделам драйвера из задач и прерываний. Я разрабатываю для ARM.
Если я использую spin_lock_irqsave()
и spin_unlock_irqrestore()
pair для защиты своих критических разделов, заблокирован ли FIQ в этих критических разделах?
В частности, я попытался посмотреть на реализации этих двух функций spin_lock_irqsave()
. Мое первоначальное впечатление заключается в том, что FIQ не отключен. Просто хочу проверить это у здешних экспертов.
Пожалуйста, просветите меня. Спасибо!
Ответ №1:
Я не думаю, что Linux использует FIQ, поэтому FIQ не будет конфликтовать с ISR Linux. Тем не менее, я полагаю, что он использует:
cpsid i
Это отключает обычные прерывания. Чтобы также отключить FIQ, ему нужно было бы сделать
cpsid if
Смотрите: https://elixir.bootlin.com/linux/latest/source/arch/arm/include/asm/irqflags.h#L25
Комментарии:
1. Привет @stark, просто чтобы уточнить, я придерживаюсь того же мнения, что Linux, скорее всего, не использует FIQ, но кодовая база, над которой я работаю, использует FIQ для своих собственных целей. Этот FIQ вызывает мой код драйвера.
2. Если вам нужно отключить FIQ, вы могли бы создать свой собственный irq_save.
3. … но следите за условиями гонки в порядке отключения / включения.