В соответствии с исходным кодом Linux и этой темой: полностью ли выполняются системные вызовы внутри обработчика программных прерываний?
Кажется, что некоторые системные вызовы полностью обрабатываются внутри обработчика прерываний (без учета системных вызовов vDSO). Это будет означать, что системный вызов блокирует выполнение всех других задач до тех пор, пока он не заблокируется на семафоре или не приведет к выходу.
Мой вопрос: исправляет ли патч Linux PREEMPT_RT эти вызовы и как?
В документации говорится:
Преобразование обработчиков прерываний в вытесняемые потоки ядра: Патч RT-Preempt обрабатывает программные обработчики прерываний в контексте потока ядра, который представлен task_struct как обычный процесс пользовательского пространства. Однако также возможно зарегистрировать IRQ в контексте ядра.
(источник: https://rt.wiki.kernel.org/index.php/Frequently_Asked_Questions а>)
Кажется, что это отложено до потока, но код swi_handler (arm) в исправленном ядре Linux по-прежнему вызывает функцию sys_* в обработчике.
Если предположить, что системный вызов обрабатывается потоком ядра с привилегиями (кольцо 0/супервизор), имеет ли этот поток ядра тот же приоритет выполнения, что и вызывающий поток?
Имеет смысл избегать инверсии приоритетов.