computer_knowledge_notes/Hardware/Intel/Interrupt/APIC.md

59 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#### APIC简介
Advanced Programmable Interrupt Controller是一个与8259A兼容的高级中断处理器。APIC分为两层Local APIC和I/O APIC。
![APIC](_img/APIC.jpg)
- I/O APIC I/O APIC是用来与外部设备通讯的它安装在主板上它完成了APIC最主要的功能中断处理。 I/O APIC提供了两个模式普通模式和8259A兼容模式。xv6在单核环境下会选择使用8259A兼容模式而在多处理器环境下则会使用普通模式。
- Local APIC是APIC的顶层每个核都有一个对应的Local APICLAPIC内置在CPU内部。它负责进行多处理器之间的中断传输屏蔽中断还提供了一个可编程的Timer。由于I/O APIC已经提供了中断处理的功能Local APIC只是起辅助作用可以屏蔽不用。
#### APIC的中断映射
| IRQ | Using SERIRQ | Direct form Pin | Using PCI Message | Internal Modules |
| ------ | ------------ | --------------- | ----------------- | ----------------------------- |
| 0 | | | | |
| 1 | | | | |
| 2 | | | | |
| 3 | | | | |
| 4 | | | | |
| 5 | | | | |
| 6 | | | | |
| 7 | | | | |
| 8 | | | | |
| 9 | | | | |
| 10 | | | | |
| 11 | | | | |
| 12 | | | | |
| 13 | | | | |
| 14 | | | | |
| 15 | | | | |
| 16~19 | PIRQA~PIRQD | PIRQA~PIRQD | Yes | Internal devices are routable |
| 2023 | N/A | PIRQH | Yes | |
#### 控制方式
APIC通过修改该单元的寄存器来实现控制但APIC的相关寄存器被映射到了物理地址。
- Local APIC默认映射到物理地址`0xFEE0 0000`
- IO APIC 默认映射到物理地址`0xFEC0 0000`
#### PRT表的格式
Programmable Redirection Table(24*64bit)IOAPIC上有24个interrupt pin每一个pin都对应一个RTE,所以针对每一个interrupt pin都可以单独设定它的mask触发方式(level,edge trigger),中断管脚的极性,传送方式,传送状态,目的地,中断向量等。
| bit | 意义 |
| ------ | ------------------------------------------------------------ |
| 6356 | Destination Field(Physical Mode:APIC ID, Logical Mode:一组CPU) |
| 5517 | Reserved |
| 16 | Interrupt Mask(1:屏蔽中断0:中断发给LAPIC) |
| 15 | Trigger Mode(1:Level电平触发。0Edge边沿触发) |
| 14 | Remote IRR,只读只对Level触发有效。1LAPIC接收了该中断0LAPIC写EOI |
| 13 | Interrupt Input Pin Polarity(INTPOL)(1:低电平0高电平) |
| 12 | Delivery Status(0:IDEL,当前没有中断1:Send PendingIOAPIC已收到中断但由于某种原因还没有发给LAPIC) |
| 11 | Destination Mode(0:Physical Mode, 1: Logical Mode) |
| 10:8 | Delivery Mode(0:Fixed, 1:Lowest Priority, 2: SMI, 4: NMI, 5:INIT, 7:ExtINT ) |
| 7:0 | Interrupt Vector(0x10~0xFE, X86架构的前16个vector被系统预留) |