Linux PREEMPT_RT: системные вызовы по-прежнему обрабатываются программным обработчиком прерываний?

В соответствии с исходным кодом 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/супервизор), имеет ли этот поток ядра тот же приоритет выполнения, что и вызывающий поток?

Имеет смысл избегать инверсии приоритетов.


person Loukis95    schedule 29.03.2018    source источник
comment
Современная система, использующая sysenter/sysexit, не выполняет системные вызовы внутри ISR. системные вызовы выполняются в контексте вызывающего процесса.   -  person Zang MingJie    schedule 29.03.2018
comment
А на архитектуре ARM тогда? Насколько я знаю, инструкций для sysenter/sysexit нет.   -  person Loukis95    schedule 29.03.2018