2014-03-11 3 views
2

Как я знаю, мы можем проверить, что мы находимся в контексте прерывания, включив 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, но мы делаем ошибка.

ответ

1

Есть несколько интересных функций в preempt_mask.h:

  • in_irq(): аппаратное прерывание
  • in_softirq(): Мы в контексте softirq?
  • in_interrupt(): контекст прерывания?
  • in_nmi(): Мы находимся в контексте NMI?
  • in_atomic(): Мы работаем в атомном контексте? ВНИМАНИЕ: этот макрос не всегда может обнаружить атомный контекст

Пожалуйста, обратите внимание, что при нормальных обстоятельствах, водитель не нужно использовать какие-либо из этих функций.

1

Я думаю, что in_interrupt() - НЕОБХОДИМЫЙ дизайн!

Если ваши коды рушатся в контексте процесса, вам не нужно вызывать in_interrupt().

in_serving_softirq() указывает, что вы находитесь в реальном контексте softirq do_softirq() not local_bh_disable().

Смежные вопросы