Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра Linux | ||
Назад | Внутренние механизмы ядра | Вперед |
Отображение прерываний в /proc
Но, прежде чем дальше углубляться в организацию обработки прерывания, коротко остановимся на том, как мы можем наблюдать и контролировать то, что происходит с прерываниями. Всякий раз, когда аппаратное прерывание обрабатывается процессором, внутренний счётчик прерываний увеличивается, предоставляя возможность контроля за подсистемой прерываний; счётчики отображаются в /proc/interrupts (последняя колонка это и есть имя обработчика, зарегистрированное параметром name в вызове request_irq()). Ниже показана «раскладка» прерываний в архитектуре x86, здесь источник прерываний — стандартный программируемый контроллер прерываний PC 8259 (XT-PIC):
$ cat /proc/interrupts
CPU0 0: 33675789 XT-PIC timer 1: 41076 XT-PIC i8042 2: 0 XT-PIC cascade 5: 18 XT-PIC uhci_hcd:usb1, CS46XX 6: 3 XT-PIC floppy 7: 0 XT-PIC parport0 8: 1 XT-PIC rtc 9: 0 XT-PIC acpi 11: 2153158 XT-PIC ide2, eth0, mga@pci:0000:01:00.0 12: 347114 XT-PIC i8042 14: 38 XT-PIC ide0 ...
Примечание: Если точнее, то
показано схема с двумя каскодно объединёнными (по линии IRQ2)
контроллерами 8259, которая была классикой более 20 лет (чип
контроллера прерываний 8259 создавался ещё под 8-бит процессор 8080).
Эта «классика» начала постепенно вытесняться только в
последние 5-10 лет, в связи с широким наступлением SMP архитектур, и
применением для них нового контроллера: APIC. Одним из первых ставших
стандартным образцом стал чип 82489DX
,
но на сегодня функции APIC просто вшиты в чипсет системной платы.
Архитектура APIC позволяет обслуживать число линий IRQ больше 16-ти,
что было пределом на протяжении многих лет.
Те линии IRQ, для которых не установлены текущие обработчики прерываний, не отображаются в /proc/interrupts. Вот то же самое, но на существенно более новом компьютере с 2-мя процессорами (ядрами), когда источником прерываний является усовершенствованный контроллер прерываний IO-APIC (отслеживаются прерывания по фронту и по уровню: IO-APIC-edge или IO-APIC-level):
$ cat /proc/interrupts
CPU0 CPU1 0: 47965733 0 IO-APIC-edge timer 1: 10 0 IO-APIC-edge i8042 4: 2 0 IO-APIC-edge 7: 0 0 IO-APIC-edge parport0 8: 1 0 IO-APIC-edge rtc0 9: 24361 0 IO-APIC-fasteoi acpi 12: 157 743 IO-APIC-edge i8042 14: 700527 0 IO-APIC-edge ata_piix 15: 525957 0 IO-APIC-edge ata_piix 16: 1146924 0 IO-APIC-fasteoi i915, eth0 18: 78 441659 IO-APIC-fasteoi uhci_hcd:usb4, yenta 19: 3 777 IO-APIC-fasteoi uhci_hcd:usb5, firewire_ohci, tifm_7xx1 20: 2087614 0 IO-APIC-fasteoi ehci_hcd:usb1, uhci_hcd:usb2 21: 190 11976 IO-APIC-fasteoi uhci_hcd:usb3, HDA Intel 22: 0 0 IO-APIC-fasteoi mmc0 27: 0 0 PCI-MSI-edge iwl3945 NMI: 0 0 Non-maskable interrupts ...
Ещё одним источником (динамической) информации о произошедших (обработанных) прерываниях является файл /proc/stat:
$ cat /proc/stat
cpu 2949061 32182 592004 6337626 301037 8087 4521 0 0 cpu0 1403528 14804 320895 3068116 167380 6043 4235 0 0 cpu1 1545532 17377 271108 3269510 133657 2043 285 0 0 intr 139510185 47968356 10 0 0 2 0 0 0 1 24361 0 0 900 0 700531 525967 1147282 0 441737 780 2087674 12166 0 0 0 0 0 0 ...
Здесь строка, начинающаяся с intr содержит суммарные по всем процессорам значения обработанных прерываний для всех последовательно линий IRQ.
Теперь, умея хотя бы наблюдать происходящие в системе прерывания, мы готовы перейти к управлению ними.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Регистрация обработчика прерывания | Обработчик прерываний, верхняя половина |