Как я знаю, мы можем проверить, что мы находимся в контексте прерывания, включив in_interrupt()
в ядро linux. И реализация функции in_interrupt()
подсчитывается thread_info->preempt_count
при вводе или выходе из hardirq или softirq. Итак, когда in_interrupt()
возвращает none-zero, это означает, что мы обрабатываем hardgq или softirq.О контексте прерывания, контексте атома и контексте процесса в ядре linux
Однако, мой вопрос заключается в том, когда мы включаем функцию local_bh_disable()
, она увеличивает thread_info->preempt_count
, поэтому функция in_interrupt()
возвращает none-zero. Таким образом, как мы можем определить, находимся ли мы сейчас в контексте прерывания. И, на мой взгляд, атомный контекст - это то, что локальное прерывание отключено.
Вот обстоятельства, по которым я сейчас в режиме ядра, и я хочу получить доступ к пользовательскому адресному пространству, но я не знаю, работает ли в контекст процесса или контекст прерывания из-за доступа к адресному пространству пользовательского пространства в контексте прерывания недействителен, поэтому я хочу определить, находится ли он в контексте процесса, используя функцию in_interrupt()
. Тогда я получил возвращаемое значение больше нуля, таким образом, я буду думать, что я сейчас в контексте прерывания и не получаю доступ к пользовательской области. Однако, возможно, есть функция, которая подразумевает использование local_bh_disable
для увеличения thread_info->preempt_count
, чтобы отключить сортировку, но на самом деле мы находимся в контексте процесса и просто отключили softirq, таким образом, мы могли бы безопасно обращаться к адресному пространству userland, но мы делаем ошибка.