当前位置: 首页 > article >正文

《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__lpisn》学习笔记

1.LPI(Locality-specific Peripheral Interrupts)是一种基于消息的中断(Message Signaled Interrupt,MSI),由中断翻译服务(ITS)提供翻译。这是因为LPI的设计目标是为系统中大量的设备提供高效的中断管理,而消息信号中断(MSI)是一种通过消息机制触发的中断类型,不需要传统的硬件线来触发中断。LPI的配置和管理与其他中断类型不同,它们的状态保存在内存中而不是寄存器中。对LPI的支持是可选的,可以通过寄存器GICD_TYPER.LPIS位设置,该位置1时表示支持LPI,为0不支持。

2.Redistributors使用内存中保存的表来存储LPI配置信息和每个物理LPI的状态,LPI的配置信息存储在LPI配置表中,寄存器GICR_PROPBASER提供该表的起始地址。LPI配置是全局的,即所有Redistributor必须看到相同的配置。LPI 的状态信息也存储在内存中的表中,即LPI 待处理表,寄存器 GICR_PENDBASER 提供该表的起始地址。每个Redistributor服务器都有自己的 LPI Pending 表,并且这些表不在Redistributor服务器之间共享。如下图所示:

3.当要使用LPI时,Redistributor的初始配置过程为:为LPI Configutation表分配内存,并使用每个LPI的适当配置初始化该表;在每个Redistributor中设置寄存器GICR_PROPBASER以指向LPI Configutation表;为每个Redistributor的LPI Pending表分配内存并初始化每个表的内容,在系统启动时,这通常意味着将内存清零,这意味着所有LPI INTID都处于非活动状态;在每个Redistributor中设置寄存器GICR_PENDBASER以指向与该再分发器关联的LPI挂起表;在每个Redistributor中将寄存器GICR_CTLR.EnableLPIs位设置为1以启用LPI。

4.每个LPI INTR在LPI Configutation表中占据一个字节,如下图:

虽然SPI、PPI和SGI的优先级值为8位,但表中只有6位来记录LPI的优先级,LPI优先级的低两位始终被视为0b00。没有用于记录组配置的字段,LPI始终被视为非安全组1中断。LPI Configutation表的大小取决于LPI的数量,GIC支持的INTID(SPI、PPI、SGI和LPI)的最大数量由寄存器GICD_TYPER.IDbits位指示,LPI配置表仅处理使用大于8191的INTID的LPI。因此,为了支持所有可能的LPI,LPI配置表大小计算如下:大小(以字节为单位) = 2GICD_TYPER.IDbits+1 – 8192。但寄存器GICR_PROPBASER还包括一个IDbits字段,该字段指示LPI配置表支持的INTID数量,该数字必须等于或小于GICD_TYPER.IDbits中的值。所以LPI配置表所需的大小变为:大小(以字节为单位) = 2GICR_PROPBASER.IDbits+1 – 8192。中断控制器必须能够读取为LPI配置表分配的内存,但它永远不会写入该内存。

5.LPI 的状态信息存储在内存中,LPI只有两种状态:非活动或待处理。当中断被确认时,中断会从挂起状态转换为非活动状态。如下图:

因为只有两种状态,所以LPI Pending表中每个LPI只有1位。因此,为了支持实现中所有可能的INTID,LPI待处理表的大小必须为:大小(以字节为单位)=2GICR_PROPBASER.IDbits+1/8。与LPI配置表不同,LPI挂起表的大小不会调整以考虑从INTID8192开始的LPI。表的前1KB(对应于INTID 0到8291的条目)存储实现定义状态。

6.LPI配置信息存储在内存中的表中,而不是寄存器中。出于性能原因,再分发器会缓存LPI配置信息。这意味着要重新配置LPI,软件必须:更新LPI配置表中的条目、确保更新的全局可见性、使再分发器中的任何配置缓存无效。通过发出ITS的INV或INVALL命令来使再分发器中的高速缓存失效,INV命令使特定中断的条目无效,因此该命令通常在重新配置少量LPI时使用,INVALL命令使指定集合中所有中断的条目无效。如果未实现ITS,软件必须写入GICR_INVLPIR(针对特定中断条目)或GICR_INVALLR(针对所有中断条目)寄存器,以使重新分配器重新加载中断配置。

7.ITS:即Interrupt Translation Service,外设通过向ITS中的GITS_TRANSLATER写入消息来生成LPI。这为ITS提供了以下信息:事件ID:这是写入GITS_TRANSLATER的值,EventID标识外设正在发送哪个中断,EventID可能与INTID相同,或者它可能由ITS转换为INTID;设备ID:DeviceID用来标识外设,DeviceID的生成机制是由具体实施定义的。ITS负责将消息转换为可传递至连接核心的INTID。物理LPI被分组到集合中。集合中的所有LPI都路由到同一个再分发器。软件将LPI分配给集合,从而使其能够有效地将中断从一个处理元素移动到另一个处理元素。


http://www.kler.cn/a/467461.html

相关文章:

  • 基于32单片机的智能语音家居
  • 逆向入门(2)C篇-基础知识
  • pdf预览兼容问题- chrome浏览器105及一下预览不了
  • weblogic安装 12.2.1.4.0 单机
  • IDEA 撤销 merge 操作(详解)
  • 生成模型的现状2025年的新兴趋势
  • 内部类 --- (寄生的哲学)
  • MQ消息队列
  • 【GBT32960协议学习系列】GBT 32960协议学习大纲
  • 【Seed-Labs 2.0】Buffer Overflow Attack Lab (Server Version)
  • [读书日志]从零开始学习Chisel 第二篇:Scala的变量与函数(敏捷硬件开发语言Chisel与数字系统设计)
  • 每日一学——自动化工具(Ansible)
  • 【练习】PAT乙1033 旧键盘打字
  • SQL把字符串按逗号分割成记录
  • 19.2、windows安全分析与防护
  • CSP初赛知识学习计划(第一天)
  • Linux相关开发工具
  • wordpress主题开发之function.php的10大作用
  • Spring Boot中的 6 种API请求参数读取方式
  • 如何解析和处理电商平台的按图搜索商品API返回值?
  • Seata 使用教程:全面解锁分布式事务管理
  • 32单片机从入门到精通之开发环境——集成开发环境(IDE)(五)
  • 源码理解 UE4中的 FCookStatsManager::FAutoRegisterCallback RegisterCookStats
  • MySQL数据结构选择
  • 13-Gin 中使用 GORM 操作 mysql 数据库 --[Gin 框架入门精讲与实战案例]
  • 软件测试面试题(一)