Arm GIC-v3中断原理及验证(通过kvm-unit-tests)

news2024/11/25 16:19:07

一、参考连接

gic-v3相关原理可参考https://zhuanlan.zhihu.com/p/520133301

本文主要通过开源测试工具kvm-unit-tests,针对GIC的中断进行一系列验证,这样可以直入中断底层,熟悉整个原理。

kvm-unit-tests官网为kvm-unit-tests / KVM-Unit-Tests · GitLab

armv8寄存器介绍官网为Documentation – Arm Developer

GICv3官方文档为Documentation – Arm Developer

二、中断验证

        GIC的中断主要为四类,即SGI(IPI)、PPI、SPI、LPI,本文主要针对这四类进行验证。具体原理将在验证中随意阐述。总体来看kvm-unit-tests源码的理解难度要低于kernel源码,所以方便引用,其实底层逻辑其实是一样的。

        GIC总计结构:

        GIC中断分布:

中断类型中断号说明
SGI0 - 15
PPI16 – 31
SPI32 - 1019
特殊中断号1020 - 1023
保留中断号1024 - 1055
扩展PPI1056 -1119GICv3.1版本后才支持
保留中断号1120 - 4095
扩展SPI4096 - 5119GICv3.1版本后才支持
保留中断号5120 - 8191
LPI8192 -最大支持的中断号由实现确定

        先来整体看下一个机器中断的整体分布,我是在VM中:

        再来看个kvm-unit-tests的整体测试吧,就当留个印象。

2.1 SGI(software generated interrupt)(IPI)中断验证        [0-15]

       该类型中断并没有实际的物理连线,而是通过由软件写寄存器方式触发,它只支持边沿触发。通常用于处理器之间的通信,如linux内核电源管理模块中调用的ipi中断就是通过SGI实现的。

        IPI即核间中断,arm的叫sgi。

        kvm-unit-tests(本文以后简称k-u-t)中正好有专门的SGI检测项,可以通过总体测试然后log输出,也可以单独加参数测试验证:

2.1.1中断发送

发送中断的本质其实,从软件层面来讲,其实就是写寄存器。发送SGI中断的步骤归纳如下:

  1. 通过GICR_ISENABLER0寄存器设置中断使能
  2. 通过GICR_IPRIORITYR<n>设置优先级
  3. 写寄存器 GICD_SGI1R
  4. 写寄存器 ICC_SGI1R_EL1

kut中关于发送sgi中断的函数是lib/arm/gic-v3.c中的gicv3_ipi_send_mask()函数(可类比kernel-5.10中的gic_ipi_send_mask函数),

再看下写入到寄存器ICC_SGI1R_EL1中的值,以及spec中规定的ICC_SGI1R_EL1各字段含义:

嗯,只能说是一模一样。所以这就是软件层面发送sgi中断的最终操作,剩下的就是硬件层面的事了。

类比kernel-5.10中sgi中断发送代码的调用路径是:

        gic_ipi_send_mask-->gic_send_sgi-->gic_write_sgi1r

其实除了逻辑更复杂了,整体框架都一样。

2.1.2中断接收处理

接收中断的处理函数是arm/gic.c中的irq_handler(),这个函数基本上总结了所有中断handler的模板:

  

所以中断处理的一般步骤就是:

  1. 读取iar寄存器,获取到描述irq的结构体irq_data;
  2. 通过irq_data获取到irq_num;
  3. 具体的中断处理;
  4. 回写eoi寄存器,中断结束。

kut因为只是模拟测试,所以中断handler比较简单,具体的sgi中断处理只是简单的记录信息,如ack[cpuid]++;表示本cpu接收到了中断。

2.1.3kut中sgi测试总体逻辑

由于讲述中断,所以直接开讲的中断发送以及中断处理,其实是倒叙看源码了。正序应该是类似gdb似的从头开始。kut中每个test-case都有一个main函数,当我们独立测试某一项时,如测试gic的sgi中断,当我们命令行输入-append ipi时,就已经进入到sgi测试的主入口了,程序逻辑依次是:

至此,SGI中断的逻辑以及原理差不多可以了,反正就是触发SGI中断就写ICC_SGI1R_EL1寄存器,接收中断handler就是按标准步骤操作寄存器:读取iar,获取irq,逻辑处理,回写eoi。

2.2 PPI(private peripheral interrupt)中断验证        [16-31]

       该类型中断是每个处理器私有的,即一个特定的中断只会被路由到特定的处理器上。且其同一个中断号在每个处理器上都可以有不同的中断,如对于一个拥有两个PE的smp系统,中断号16的PPI中断可以分别被注册为PE0和PE1的私有中断,它们可以被独立触发并被特定的PE独立处理.

        kut中没有显式测试ppi的用例,但其中有个timer的测试用例,通过/proc/interrupt可以看出,timer的中断其实就是ppi的中断,毕竟每个cpu都会独立收到timer。所以直接测试kut中的timer一项即可,其中的打印为我自己加的补丁,可以看到timer的irq正好属于[16-31]这个PPI区间。

2.2.1中断发送

发送PPI中断的步骤归纳如下

  1. 通过GICR_ISENABLER0寄存器设置中断使能
  2. 通过GICR_IPRIORITYR<n>设置优先级
  3. 写相应的寄存器(如timer的)

同样的,timer也有一大堆寄存器来控制,包括使能ctl、读写比较值cval、读写时间值tval、读count等。发中断就是设置其中的寄存器,然后等待时间到时(硬件计数)就可以了。

kut中关于timer中断的发送主要为test_timer的子函数 ,分别为 test_timer_cval-->test_cval_10msec(测试compare val寄存器);  test_timer_pending(测试timer中断);  test_timer_tval(测试time val寄存器);

相比而言,timer的寄存器字段较为简单,都不用像sgi寄存器那样显示组装各个field。

2.2.2中断接收处理

timer的接收中断的处理函数是arm/timer.c中的irq_handler(),定睛一看 似曾相识,不用多讲了吧。

唯一的中断处理逻辑就是置位irq_received = true; 这不比看kernel那一坨代码简洁多了。

2.2.3kut中ppi测试总体逻辑

话不多说,直接看图。简洁,太简洁了。

但其实除此之外,还有init的一大段,这个是所有test-case共有的,算作整个kut的初始化吧,ptimer和vtimer的中断号也是在init时从dtb读出来确定的,一开始的入口是arm/cstart.S中:

其中有个setup基本就是在给main铺路了,包括设置内存分布,各类设备初始化,堆栈空间初始化等等,基本看函数名就不用再注释了。

其中timer的irq就在timer_save_state的子函数timer_save_state_fdt中从dtb读出来并设置好,本次实验中的irq打印也是在此插桩。

所以到此,PPI中断也基本讲完了。其实还是老一套,发中断就是写某个寄存器触发某个事件(timer就是写cntp_tval,别的就写对应的reg),中断处理还是四步走。只不过PPI是换成了私有的private的,各个cpu都整了一套。

2.3 SPI(shared peripheral interrupt)中断验证        [32 - 1019]

        SPI中断不与特定的cpu绑定,可以根据affinity配置被路由到任意cpu或一组特定的cpu上。如一般的外设中断都是通过SPI方式连接的。

        kut中并没有看到专门的测试spi中断的test-case,误打误撞却发现kut中有个RTC设备pl031设备用的就是SPI,其中断号34正好属于这个区间,有了前面timer分析的基础,看懂这个rtc设备的发送中断以及中断处理简直是降维打击,读者朋友们自行去看吧,实在不用分析了。

        其实验证SPI中断我本来是想用串口uart-pl011这个设备的,奈何kut中没有对串口进行单独的test-case,而只是把它当作了标准输出stdio,如果重新写一个testcase的话倒也可以(看以后有没有时间即兴趣了),但只是为了测试SPI而加用例,好像不太符合kut的目的。

所以暂时用之前的模拟串口来看吧,反正也能看出uart0中断处理,任意敲击按键,就能发现uart0的中断数++。原理其实是一样的,就是没有显式的代码去一行行验证了。其中

console1:

console2:

2.4 LPI(Locality-specific Peripheral Interrupt)中断验证        [8192 - 具体实现决定max]

        该类型中断是一种基于消息的中断,外设不需要通过硬件中断线连接到GIC上, 而可以向特定地址写入消息来触发中断。典型的应用为PCIe的MSI和MSI-X中断。
  LPI中断有一些其特有的属性,如只支持non secure group1分组、只支持边沿触发、可以选择使用或不使用ITS路由,以及没有active状态,也不需要显式的deactivation操作。

        kvm-unit-tests中正好有专门的LPI检测项,其实就是ITS那一大堆测试,我就拿其中的一个its-trigger来讲解吧。

        处理LPI中断,首先得了解些GIC,GICv3组件如下图所示:

其中 Distributor、Redistributor、ITS和cpu interface是主要组件,可以看首字母区分。有几个虚拟化中断的组件列举几个控制寄存器说明下他们的区别:

ICC_CTLR_EL1

Controls aspects of the behavior of the GIC CPU interface and provides information about the features implemented.

ICH_HCR_EL2

Controls the environment for VMs.

ICV_CTLR_EL1

Controls aspects of the behavior of the GIC virtual CPU interface and provides information about the features implemented.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『 Linux 』协议的定制

文章目录 协议的概念序列化和反序列化网络计算器套接字接口的封装服务端大致框架协议的定制Request的序列化与反序列化Response的序列化与反序列化报头的封装的解包网络服务服务端的封装已提取报文的移除客户端的封装客户端的调用服务端接收多个请求 JSON 自动序列化反序列化使…

QT打开摄像头采集

QT打开摄像头采集 今天好不容易把opencv的环境装好&#xff0c;然后想学习一下人脸识别的功能&#xff0c;但是在图书馆坐了4个多小时了&#xff0c;屁股疼就先写个摄像头采集的功能&#xff0c;明天继续学习吧&#xff0c;废话不多&#xff0c;嚼个奶片开始发车&#xff01;&…

3.安卓逆向-java语言控制流和数据类型

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 上一个内容&#xff1a;2.安卓逆向-初识java语言 上一个内容里写了编写java语言代码的环境搭建&#xff0c;也就是下载…

你的个人生成式AI创新课程

我曾经写过许多博客文章&#xff0c;讨论如何使用生成式AI&#xff08;GenAI&#xff09;工具&#xff0c;例如OpenAI ChatGPT、微软Copilot和Google Gemini来提升专业效率和个人发展。然而&#xff0c;我们必须从仅仅使用这些GenAI工具来提高生产力的思维模式&#xff0c;转变…

echarts 关系图 legend 图例不显示问题

关系图希望显示图例&#xff0c;如下效果&#xff1a; 按照常规echarts图表的配置&#xff0c;配置完legend&#xff0c;图例居然不显示。 legend: {show: true,icon: circle,left: left }经过一番查找和思考&#xff0c;原来是因为series配置中没有设置categories项&#xf…

通信工程学习:什么是SLF签约数据定位功能

SLF&#xff1a;签约数据定位功能 SLF&#xff08;Subscription Locator Function&#xff09;即签约数据定位功能&#xff0c;是IMS&#xff08;IP Multimedia Subsystem&#xff09;IP多媒体子系统体系结构中的一个关键组成部分。其主要功能是在网络运营商部署了多个独立可寻…

Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?

技术选型 我们知道&#xff0c;Android平台一般RTMP|RTSP播放器通常不直接提供回调YUV或RGB数据的功能。如果播放端有视觉分析或类似的需求&#xff0c;需要播放端&#xff0c;能支持YUV或ARG的数据回调&#xff0c;一般来说&#xff0c;可参考的方法如下&#xff1a; 1. 使用…

尚硅谷的尚乐代驾项目

项目源码 乐尚代驾项目: 重做乐尚代驾项目 (gitee.com) 一 项目介绍 1 介绍 【**乐尚代驾**】代驾是一种新型的出行服务模式&#xff0c;主营业务&#xff1a;酒后代驾、商务代驾、长途代驾&#xff0c;其主要特点是通过线上平台为用户提供代驾服务&#xff0c;伴随中国家…

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、…

Navicat备份数据库

Navicat备份数据库 &#x1f4d4; 千寻简笔记介绍 千寻简文库已开源&#xff0c;Gitee与GitHub搜索chihiro-doc&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;文库采用精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮助请帮我点一…

【Hot100】LeetCode—300. 最长递增子序列

目录 1- 思路题目识别动规五部曲 2- 实现⭐最长递增子序列——题解思路 3- ACM 实现 原题链接&#xff1a;300. 最长递增子序列 1- 思路 题目识别 识别1 &#xff1a;给出一个数组输入 nums识别2&#xff1a;严格递增的子序列&#xff0c;子序列可以是不连续的 动规五部曲 …

数据处理与统计分析篇-day02-Linux进阶

day02-Linux进阶 补充昨日内容 Linux基础 文件编辑 命令模式 编辑模式 esc回到命令模式 正常编辑 底行(底线)模式 查看Linux命令帮助文档 # --help 可以查看命令的详细信息 命令名 --help ​ # 例如: ls --help ​ # man 可以查看命令的主要(简单)信息 man 命令名…

树莓派替代台式计算机?树莓派上七款最佳的轻量级操作系统!

​Raspberry Pi 是一款超级实惠的单板计算机&#xff08;SBC&#xff09;&#xff0c;可用于各种不同的项目。Raspberry Pi 的一些最流行用途包括将其变成媒体播放器或模拟机器。鉴于该系统的多功能性&#xff0c;有人想知道它是否可以替代台式计算机。好吧&#xff0c;它可以&…

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关&#xff0c;每一关都包含着不同上传方式。 注意 1.每一关没有固定的…

Postman做接口测试时一些实用的操作

Postman 之前是作为Chrome 的一个插件&#xff0c;现在要下载应用才能使用。 以下是postman 的界面&#xff1a; 各个功能区的使用如下&#xff1a; 快捷区&#xff1a; 快捷区提供常用的操作入口&#xff0c;包括运行收藏夹的一组测试数据&#xff0c;导入别人共享的收藏夹测…

论文解读:利用大模型进行基于上下文的OCR校正

论文地址&#xff1a;https://arxiv.org/pdf/2408.17428 背景概述 研究问题&#xff1a;这篇文章要解决的问题是如何利用预训练的语言模型&#xff08;LMs&#xff09;来改进光学字符识别&#xff08;OCR&#xff09;的质量&#xff0c;特别是针对报纸和期刊等复杂布局的文档。…

GDPU Java Web 天码行空1

目的&#xff1a; 1、 掌握Java Web编程环境的配置 2、 创建简单的Web工程&#xff0c;并了解Web工程下各目录的作用 3、 掌握部署、运行Web工程的流程 实验过程&#xff1a; 一、完成如下要求。 安装并设置JDK 1.8、Tomcat 9.0&#xff08;tomcat和jdk版本匹配请看下图&am…

初创企业的信息架构蓝图:从构想到实施的全面攻略

初创企业的信息架构蓝图&#xff1a;从构想到实施的全面攻略 在数字化转型的大趋势下&#xff0c;初创企业面临着巨大的机遇和挑战。如何快速搭建稳健的信息架构蓝图&#xff0c;以支持业务增长、提高运营效率并确保数据安全&#xff0c;成为初创企业成功的关键因素。《信息架…

动手学习RAG:迟交互模型colbert微调实践 bge-m3

动手学习RAG: 向量模型动手学习RAG: BGE向量模型微调实践]()动手学习RAG: BCEmbedding 向量模型 微调实践]()BCE ranking 微调实践]()GTE向量与排序模型 微调实践]()模型微调中的模型序列长度]()相似度与温度系数 本文我们来进行ColBERT模型的实践&#xff0c;按惯例&#xff…

5G毫米波阵列天线仿真——CDF计算(手动AC远场)

之前写过两个关于阵列天线获取CDF的方法&#xff0c;一个通过Realized Gain&#xff0c;一个通过Power Flow&#xff0c; 三个案例中都是3D中直接波束扫描&#xff0c;并没有展示场路结合的情况。这期我们用Power Flow的方法&#xff0c;手动合并AC任务的波束计算CDF。 还是用…