Обработка прерываний в системе SMP ARM с GIC

Я хотел знать, как работает обработка прерываний с момента прерывания любого устройства. Я знаю обработку прерываний по частям и хотел бы иметь четкую сквозную картину обработки прерываний. Позвольте мне рассказать то немногое, что я знаю об обработке прерываний. .

Предположим, что устройство FPGA прерывается через электрические линии и получает некоторые данные. Драйвер устройства для этого устройства FPGA уже имеет код (обработчик прерывания), зарегистрированный с помощью функции request_irq.

Итак, теперь у устройства FPGA есть линия IRQ, которую оно получает после вызова request_irq, с помощью этого устройства линии IRQ отправляет данные в контроллер общих прерываний, а GIC будет выполнять много преобразований в одну линию IRQ и отправлять сигнал в ядро ​​ЦП, которое затем вызывает ниже минимальный код

IRQ_handler
SUB       lr, lr, #4       ; modify LR
SRSFD     #0x12!           ; store SPSR and LR to IRQ mode stack
PUSH      {r0-r3, r12}     ; store AAPCS registers on to the IRQ mode stack
BL        IRQ_handler_to_specific_device
POP       {r0-r3, r12}     ; restore registers
RFEFD     sp!              ; and return from the exception using pre-modified LR 

IRQ_handler_to_specific_device - это не то, что мы зарегистрировали в драйвере устройства с помощью вызова request_irq ().

Я до сих пор не понимаю, как ядро ​​процессора узнает об источнике прерывания? (От какого устройства исходит прерывание)

И какова роль вызова, такого как do_irq и общие прерывания?

Нужна помощь в понимании сквозной картины обработки прерываний в архитектуре ARM?


person Amit Singh Tomar    schedule 16.04.2014    source источник
comment
В руководстве программиста Cortex A Series есть хороший раздел об обработке IRQ, к тому же вам, вероятно, потребуется либо прочитать спецификацию GIC, либо собственную реализацию документации по блоку IRQ поставщиками. (как вы можете найти на cortex-A8s)   -  person auselen    schedule 16.04.2014
comment
Спасибо, @artlessnoise не мог многого спросить, но, честно говоря, я бы просто искал простую сквозную обработку прерываний. Рисунок в данной ссылке лучше подскажет, что я ищу makelinux.net/books/lkd2/ch06lev1sec6. Также, пожалуйста, дайте мне знать, правильно ли то понимание, которое я поставил под вопрос?   -  person Amit Singh Tomar    schedule 16.04.2014


Ответы (1)


GIC разделен на два раздела. Первый называется дистрибьютор. Это глобально для системы. К нему физически направлено несколько источников прерываний; хотя это может быть в пакете SOC. Второй раздел реплицируется на процессор и называется интерфейсом процессора. У дистрибьютора есть логика, как распределять общие периферийные прерывания или SPI. Это тип прерывания, о котором спрашивает ваш вопрос. Это глобальные аппаратные прерывания.

В контексте Linux это реализовано в irq-gic.c. В gic.txt. Особый интерес,

  • reg: Определяет базовый физический адрес (а) и размер регистров GIC. Первый регион - это база и размер регистра GIC дистрибьютора. Вторая область - это база и размер регистра GIC интерфейса процессора.

Доступ к дистрибьютору должен быть глобальным, поэтому необходимо позаботиться об управлении его регистрами. Интерфейс ЦП имеет одинаковый физический адрес для каждого ЦП, но каждый ЦП реализуется отдельно. Распределитель может быть настроен для маршрутизации прерываний к определенным ЦП (включая кратные). См .: gic_set_affinity (), например. Также любой ЦП может обработать прерывание. Регистр ACK выделяет IRQ; первый процессор, который его прочитает, получает прерывание. Если ожидает несколько прерываний и есть два считывания ACK от разных ЦП, то каждый получит свое прерывание. Третье чтение ЦП получит ложное IRQ.

Кроме того, каждый интерфейс ЦП имеет несколько частных источников прерываний, которые используются для прерываний между ЦП, а также частных таймеров и т.п. Но я считаю, что главный вопрос заключается в том, как физическое периферийное устройство (уникальное для системы) направляется к ЦП в системе SMP.

person artless noise    schedule 16.04.2014
comment
@artness с вашим ответом и этой ссылкой linuxburps.blogspot.in/2013/ 10 / linux-interrupt-handle.html может отображать обработку прерываний в Linux, и я полагаю, что handle_irq_event_percpu () - это функция от GIC. - person Amit Singh Tomar; 16.04.2014
comment
Linuxburps blogspot - лучшая ссылка, чем другая. Существуют разные драйверы irqchip и некоторый код, специфичный для ARM, а затем общий код Linux; irq-gic.c - это драйвер GIC irqchip. Некоторые из универсального кода специализированы в зависимости от характеристик процессора (ARM). - person artless noise; 17.04.2014
comment
Я попытался ознакомиться со спецификациями GIC, но мне не удалось выяснить, как какое-либо устройство взаимодействует с GIC и как GIC будет фиксировать прерывание, исходящее от любого устройства на физических электрических линиях. Не могли бы вы предоставить мне ссылку на документацию для этого? - person Amit Singh Tomar; 23.04.2014
comment
GIC - это программное обеспечение. Разработчик SOC подключит физические линии. Вы должны прочитать документацию по конкретному чипу, чтобы собрать это воедино. Т.е. это будет определять конкретный используемый ЦП / Чип, а не GIC. GIC даже может быть настроен разработчиком SOC, поэтому количество прерываний и т. Д. Может варьироваться. На самом деле, людям нужно знать VHDL или Verilog, чтобы понимать некоторую документацию ARM. Я чувствую твою боль. - person artless noise; 23.04.2014