GIC/ITS代码分析(9)中断应用实例之PPI中断

        PPI中断为外设私有中断,在ARM64上arch_timer为PPI中断。这里以arch_timer为例(代码位置drivers/clocksource/arm_arch_timer.c),作应用实例讲解。

        先对ARM64通用定时器作简要介绍。通用定时器为Arm core提供标准定时器。通用定时器包括一个系统counter和一组每core定时器。

        其中system counter处于always on的电源域,它提供固定频率的系统计数。它对系统上所有core都是广播的。每个core都有一组timer,它们与system counter进行比较,软件可配置每个timer在将来某个点产生中断或event。如上图,当中断产生时会通过GIC中GICR传递给GICC,最终由本core来完成中断的处理。

        在ARM64中如下中断ID(INTID)用于由SBSA定义的每个定时器,如下:

Timer

SBSA推荐的INTID

EL1 physical timer

30

EL1 virtual timer

27

Non-secure EL2 physical timer

26

Non-secure EL2 virtual timer

28

EL3 physical timer

29

Secure EL2 physical timer

20

Secure EL2 virtual timer

19

        当支持Timer虚拟化时,Non-secure EL2 physical timer用于hypervisor上arch_timer,EL1 virtual timer用于guest上arch_timer。

这里以这种情况进行介绍。

        在ACPI情况下,TIMER是在GTDT表中定义的。

[GTDT表介绍可自行查看协议]

   ARM系统的timer定义为TIMER_ACPI_DECLARE(arch_timer, ACPI_SIG_GTDT, arch_timer_acpi_init)。这里分析在hypervisor上的情况。

  1. 通过函数acpi_gtdt_init()获取GTDT表中定义的定时器数目;
  2. 从GTDT表中获取HYP中断号,并通过函数acpi_register_gsi()注册中断;
  3. 从GTDT表中获取非安全EL1 physical中断号,并通过函数acpi_register_gsi()注册中断;
  4. 从GTDT表中获取EL1 virtual中断号,并通过函数acpi_register_gsi()注册中断;
  5. 将EL1 physical中断号和EL1 virtual中断号传递给KVM用;
  6. 读取系统计数器频率;
  7. 在Host上选择HYP中断为arch_timer,注意在guest上会选择EL1 virtual中断为arch_timer;
  8. 检查定时器是否处于always on电源域;
  9. 在host上注册HYP中断对应的中断处理函数arch_timer_handler_phys,在guest上注册virtual中断对应的中断处理函数arch_timer_handler_virt;
  10. 调用arch_timer_common_init()将arch_timer注册到clocksource和sched_clock中。

        无论是arch_timer_handler_phys()还是arch_timer_handler_virt(),最终会调用用户注册的定时器中断处理函数。

        对于arch_timer_common_init(),调用如下:

  1. 若在guest上为VIRT timer情况,获取计数接口为arch_counter_get_cntvct(),通过vtimer对应的寄存器获取计数;
  2. 若在host上为ptimer情况,获取计数接口为arch_counter_get_cntpct(),通过ptimer对应的寄存器获取计数;
  3. 以当前时钟频率注册clocksource;
  4. 采用上述步骤(1)中的计数接口来注册sched clock。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
armv8和armv9是英国ARM公司推出的两个处理器架构,用于移动设备、嵌入式设备和服务器等领域。在这两个架构中,异常中断GIC (Generic Interrupt Controller) 是非常重要的主题。 异常中断是指当系统发生某种事件时,处理器暂停当前任务,转而处理优先级较高的任务。异常中断包括两种类型:同步异常和中断异常。同步异常是由指令执行时产生的,如除零异常、非法指令异常等。中断异常是由外部事件触发的,如定时器中断、外设中断等。 在armv8和armv9架构中,异常的处理是通过异常向量表实现的。异常向量表是一个固定大小的表格,其中包含不同类型异常的处理函数的地址。当发生异常时,处理器会根据异常类型在异常向量表中查找相应的处理函数,并跳转到该函数执行异常处理。 GIC是一个用于处理中断的控制器,它负责管理和分发中断信号给相应的处理器核心。在多核处理器中,GIC可以实现中断的负载均衡和处理器间的中断共享。GIC具有多个中断输入通道,每个通道对应一个中断引脚。当外部设备发生中断时,通过相应的中断引脚将中断信号发送给GIC,然后GIC中断信号分发给对应的处理器核心。 armv8和armv9架构中的GIC支持多种中断处理模式,包括中断屏蔽、中断优先级配置和中断传递方式等。GIC还可以实现中断的共享和抢占,以提高中断的处理效率和可靠性。 总而言之,armv8和armv9架构中的异常中断GIC是处理器架构中非常重要的专题。通过学习异常中断的处理和GIC的功能,可以更好地理解和掌握armv8和armv9架构的中断处理机制,提高系统的可靠性和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值