2014-10-03 6 views
2

Я знаю, что ядро ​​Linux занимает стек ядра ядра как стек ISR до 2.6.32, после 2.6.32 ядро ​​использует отдельный стек, если это неправильно, исправьте меня. Не могли бы вы сказать мне, когда стек ISR настроен/скомпонован или уничтожен, если есть. Или сообщите мне имя исходного файла и номер строки? Заранее спасибо.Стек аппаратного прерывания верхней половины в ядре Linux?

Обновлено 17 октября 2014:

Есть несколько видов стека в Linux. Ниже представлены 3 основных (не все), которые я знаю.

  1. пользователя стека процесса, каждый из пользовательского пространства задача имеет свой собственный стек, это создается ттар() при создании задачи.
  2. Стек ядра для задачи пользовательского пространства, по одному для каждой задачи пользовательского пространства, это , созданный в do_fork() -> copy_process() -> dup_task_struct() -> alloc_thread_info() и используемый для system_call.
  3. Стек для аппаратного прерывания (верхняя половина), по одному для каждого процессора (после 2.6), , определенной в арку/x86/ядра/irq_32.c: DEFINE_PER_CPU(struct irq_stack *, hardirq_stack); do_IRQ() -> handle_irq() -> execute_on_irq_stack) Переключатель (стоп прерываний

Пожалуйста, дайте мне знать, если они верны или нет.

ответ

2

Для обработчика прерываний есть стек IRQ. 2 типа стека входят в изображение для обработчика прерываний:

  1. Оборудование IRQ Stack.
  2. Программное обеспечение IRQ Stack.

В отличие от обычного стека ядра, который выделяется для каждого процесса, два дополнительных стека выделяются на каждый процессор. Всякий раз, когда происходит аппаратное прерывание (или обрабатывается softIRQ), ядро ​​должно переключиться на соответствующий стек. Исторически обработчики прерываний не получали свои собственные стеки. Вместо этого обработчики прерываний будут совместно использовать стек текущего процесса, они прерываются. Стек ядра имеет две страницы; как правило, это 8 КБ на 32-разрядных архитектурах и 16 КБ на 64-битных архитектурах. Поскольку в этой настройке обработчики прерываний совместно используют стек, они должны быть исключительно экономными с теми данными, которые они выделяют там. Конечно, стеки ядра ограничены для начала, поэтому весь код ядра должен быть осторожным.

Указатели на дополнительные стеки представлены в следующем массиве: арк/x86/ядра/irq_32.c

static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly; 
static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly; 

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

  • Нет связанных вопросов^_^