中断(二)—— x86 APIC

目录

一、概述

二、APIC

2.1 I/O APIC

2.1.1 功能

2.1.2 I/O APIC 访问

2.1.3 I/O APIC中断流程

2.2 Local APIC

2.2.1 功能

2.2.2 Local APIC 访问


一、概述

本文记录一下x86下 APIC的基本工作原理。

二、APIC

8259只适用用单处理器,为了适用SMP提出APIC。一个典型的APIC有LAPIC和I/O APIC组成,如下图:

我们根据前面分析看看这两部分具体的组成和功能,对于I/O APIC来说,它有24个中断引脚,用于接收外部中断,而在其内部将pin和vector进行映射

2.1 I/O APIC

2.1.1 功能

I/O APIC 将pin上产生的中断上报给LAPIC,这个过程和8259A有所不同

  • I/O APIC 将中断信息格式化成一个消息放在系统总线上传递给LAPIC
  • I/O APIC通过直接写I/O APIC内存映射地址,在系统总线上传递消息,这无须cpu ack,其中断相应更快

典型的I/O APIC有24个pin,前面说过,中断控制器都要提供pin对应vector的映射关系,在I/O APIC中这是由PRT(programmable redirection table)提供的,它的每一项称为RTE(redirection table entry),当I/OAPIC某个管脚接收到中断信号后,会根据该管脚对应的RTE,格式化出一条中断消息,发送给某个CPU的LAPIC。I/O APIC可以有多个,当多个I/O APIC存在时,使用GSI代表每个I/O APIC管脚的编号。

RTE的格式如下:

  • 当destination mode是physical时,使用APIC ID指定唯一的目的CPU;当destination mode是Logical 时,使用mask指定目的CPU

 

 

interrupt vector指定了pin对应的vector,这里注意I/O APIC没有优先级,优先级和vector有关,vector / 8属于同一个优先级,而优先级由LAPIC指定,后面会说。

2.1.2 I/O APIC 访问

通过下面mmio map出来的寄存器间接访问内部的寄存器(IOREGSEL指定要访问的寄存器,IOWIN读出)

看一下实际物理空间布局:

  fec00000-fec003ff : IOAPIC 0
fed00000-fed003ff : HPET 0
  fed00000-fed003ff : pnp 00:04
fee00000-fee00fff : Local APIC

内部寄存器的index如下:

  • 注意IOREDTBL寄存器相应的偏移对应了pin,这样就暗含了pin和vector的关系

2.1.3 I/O APIC中断流程

外设的产生中断,按照预先 配置在PRT中的信息产生到目的,指定vector的中断消息。

2.2 Local APIC

2.2.1 功能

Local APIC的中断源有:

  • 本地中断:APIC timer,Thermal sensor,Performance monitor counter,CMCI等
  • 外部中断: I/O APIC
  • IPI

2.2.2 Local APIC 访问

根据具体版本不同Local APIC或者由mmio访问或者由msr访问(rdmsr, wrmsr)

Local APIC的基地址由IA32_APIC_BASE指定

Local APIC对应的寄存器很多,具体参照手册,这里简单的列举

和8259A类似的有ISR[0:254],IRR[0:254],TMR[0:254](trigger mode register)。

本地中断相关的配置

上述寄存器对应的field如下:

  • vector这里和I/O APIC一样,中断vector,其他的filed也和I/O APIC一致
  • 对于timer,one-shot代表一次性计数;periodic代表周期性计数,TSC-deadline代表指定TSC值计数

IPI相关配置

核间中断,向一个或者一组logical processor发送

寄存器的filed如下:

只说一下和前面相比增加的field

Destination shorthand 

  • No shorthand,使用destination field和destination mode
  • self 给自己发
  • all including self 给所有发
  • all excluding self 给除去自己的所有发

优先级

Local APIC vector越大,优先级越高,其通过vector / 16 将256个中断向量分为16个priority class,其中0无效,1不使用。那么vector由此分成两个部分

通过TPR(Task Priority Register),只有高于下图Task-Priority Class的中断才能响应。

这里还有一个PPR(Process Priority Register),它是一个只读寄存器表示当前优先级,格式和TPR一样,只有TPR vector优先级高于PPR,中断才能被响应。PPR的值是由TPR和ISR中的vector共同决定的,将二者的Task-Priority Class进行比较,最高值就是处理器当前最高优先级

这个意思就是说ISR存着CPU正在执行的中断的级别,根据它得到的当前最高优先级,那么此时有优先级低的中断过来就先不响应了。

在x86_64中CR8作为TPR

【1】82093AA 数据表 - Intel Corporation

【2】Linux APIC 详细分析

 

 

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值