鸿蒙内核源码分析(中断概念篇) | 海公公的日常工作

news2025/2/5 22:08:50

关于中断部分系列篇将用三篇详细说明整个过程.

  • 中断概念篇 中断概念很多,比如中断控制器,中断源,中断向量,中断共享,中断处理程序等等.本篇做一次整理.先了解透概念才好理解中断过程.本篇的主角是海公公,用海公公打比方说明白中断各个概念.

  • 中断管理篇 从中断初始化HalIrqInit开始,到注册中断的LOS_HwiCreate函数,到消费中断函数的 HalIrqHandler,剖析鸿蒙内核实现中断的过程,很像设计模式中的观察者模式.

  • 中断切换篇 用自下而上的方式,从中断源头纯汇编代码往上跟踪代码细节.说清楚保存和恢复中断现场TaskIrqContext过程.

中断概念

中断模块的核心是中断控制器,这可是 皇上(CPU) 身边的大红人海公公,外部人员找皇上办点事都必须经过它.

什么是中断?

  • 中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,出现了一个必须由CPU立即处理的事务。此时,CPU暂时中止当前程序的执行转而处理这个事务,这个过程就叫做中断。如图:

  • 外设可以在没有CPU介入的情况下完成一定的工作,但某些情况下也需要CPU为其执行一定的工作。通过中断机制,在外设不需要CPU介入时,CPU可以执行其它任务,而当外设需要CPU时,将通过产生中断信号使CPU立即中断当前任务来响应中断请求。这样可以使CPU避免把大量时间耗费在等待、查询外设状态的操作上,大大提高系统实时性以及执行效率。

中断相关的硬件介绍

与中断相关的硬件可以划分为三类:设备(找皇上办事的事多了去)、中断控制器(海公公)、CPU(皇上威武,执天下耳)。

  • 设备
    发起中断的源,当设备需要请求CPU时,产生一个中断信号,该信号连接至中断控制器。

  • 中断控制器
    中断控制器是CPU众多外设中的一个,管理外设的外设,外设要使用CPU得先经过它仲裁, 它一方面接收其它外设中断引脚的输入,另一方面它会发出中断信号给CPU。所以可以通过对中断控制器编程来打开和关闭中断源、设置中断源的优先级和触发方式。说的是海公公有权屏蔽大臣们的折子,降低娘娘们被临幸的等级,让你们见不到咱皇上.
    常用的中断控制器有VIC(Vector Interrupt Controller)和GIC(General Interrupt Controller)。在ARM Cortex-M系列中使用的中断控制器是NVIC(Nested Vector Interrupt Controller)。在ARM Cortex-A7中使用的中断控制器是GIC。

  • CPU
    中断控制器分发的中断源的请求给各个CPU,CPU收到请求便中断当前正在执行的任务,转而执行中断处理程序。
    用二张图说明下三者的关系,能看出咱海公公的权利有多大.

中断控制器文档可前往 ARM中断控制器 gic_v2.pdf 查看每个寄存器的作用.以下为鸿蒙内核一小部分GIC寄存器的配置.

#ifdef LOSCFG_PLATFORM_BSP_GIC_V2
#define GICC_CTLR                       (GICC_OFFSET + 0x00)            /* CPU Interface Control Register */	//CPU接口控制寄存器
#define GICC_PMR                        (GICC_OFFSET + 0x04)            /* Interrupt Priority Mask Register */	//中断优先级屏蔽寄存器
#define GICC_BPR                        (GICC_OFFSET + 0x08)            /* Binary Point Register */				//二进制点寄存器
#define GICC_IAR                        (GICC_OFFSET + 0x0c)            /* Interrupt Acknowledge Register */	//中断确认寄存器
#define GICC_EOIR                       (GICC_OFFSET + 0x10)            /* End of Interrupt Register */			//中断结尾寄存器
#define GICC_RPR                        (GICC_OFFSET + 0x14)            /* Running Priority Register */			//运行优先寄存器
#define GICC_HPPIR                      (GICC_OFFSET + 0x18)            /* Highest Priority Pending Interrupt Register */	//最高优先级挂起中断寄存器
#endif

中断源

所谓中断源,即引起中断的事件或原因,或发出中断申请的来源.
可分为外部中断源和内部中断源两大类。

  • 外部中断源是指由CPU的外部事件引发的中断。主要包括:

    • 一般中、慢速外设,如键盘、打印机、鼠标等;
    • 数据通道,如磁盘、数据采集装置、网络等;
    • 实时时钟,如定时器定时已到,发中断申请;
    • 故障源,如电源掉电、外设故障、存储器读出出错以及越限报警等事件。
  • 内部中断源是指由CPU的内部事件(异常)引发的中断,主要包括:

    • 由CPU执行中断指令INT n引起的中断;
    • 由CPU的某些运算错误引起的中断,如除数为0或商数超过了寄存器所能表达的范围、溢出等;
    • 为调试程序设置的中断,如单步中断、断点中断;
    • 由特殊操作引起的异常,如存储器越限、缺页等。
    • 核间中断,比如cpu a 让 cpu b 停止工作,产生调度等等.

这些都是想找咱皇上办事的人.

中断类型

把中断源划分为三种中断类型

  • PPI:私有外设中断(Private Peripheral Interrupt),是每个CPU私有的中断。最多支持16个PPI中断,硬件中断号从ID16~ID31。PPI通常会送达到指定的CPU上,应用场景有CPU本地时钟。
    类似于皇上自己的一些私事,不方便说的,比如大明湖畔的夏雨荷来了.

  • SGI:软件触发中断(Software Generated Interrupt)通常用于多核间通讯,最多支持16个SGI中断,硬件中断号从ID0~ID15。SGI通常在内核中被用作核间中断(inter-processor interrupts),信号会送达到系统指定的CPU上.
    主要用于多个皇上(CPU)并存的情况,皇上们直接约一起玩.

  • SPI:公用外设中断(Shared Peripheral Interrupt),最多可以支持988个外设中断,硬件中断号从ID32~ID1019。
    属于外部公事,这种事比较多,比如无法预测的吴三桂同志突然造反了,黄河决堤了等等,所以排号也多,除了前面两种其他的都属于这类的.

中断请求

“紧急事件”需向CPU提出申请(发一个电脉冲信号),要求CPU暂停当前执行的任务,转而处理该“紧急事件”,这一申请过程称为中断请求,这个申请必须经过中断控制器仲裁.

找皇上办事的人先写报告走流程,要求都要经过咱海公公处过滤.

中断触发

中断源向中断控制器发送中断信号(电平触发或边沿触发),中断控制器对中断进行仲裁,确定优先级,将中断信号送给CPU。中断源产生中断信号的时候,会将中断触发器置“1”,表明该中断源产生了中断,要求CPU去响应该中断。

相当于办事的折子,折子统一到了海公公这处理,编号.

中断优先级

为使系统能够及时响应并处理所有中断,系统根据中断时间的重要性和紧迫程度,将中断源分为若干个级别,称作中断优先级。

海公公给折子分好优先级.如花娘娘优先级最高,西施娘娘给的银子少优先级最低.

中断处理程序

当外设产生中断请求后,CPU暂停当前的任务,转而响应中断申请,即执行中断处理程序。产生中断的每个设备都有相应的中断处理程序。

海公公把折子交给了咱皇上,皇上一一处理所有折子.

中断向量表

  • 中断号 :每个中断请求信号都会有特定的标志,使得计算机能够判断是哪个设备提出的中断请求,这个标志就是中断号。

  • 中断向量 :中断服务程序的入口地址。

  • 中断向量表是存储中断向量的存储区,中断向量与中断号对应,中断向量在中断向量表中按照中断号顺序存储。
    中断向量表是所有中断处理程序的入口,如下图所示中断处理过程:把一个函数(用户中断服务程序)同一个虚拟中断向量表中的中断向量联系在一起。当中断向量对应中断发生的时候,被挂接的用户中断服务程序就会被调用执行。

所有中断都采用中断向量表的方式进行处理,即当一个中断触发时,处理器将直接判定是哪个中断源,然后直接跳转到相应的固定位置进行处理,每个中断服务程序必须排列在一起放在统一的地址上。中断向量表一般由一个数组定义或在起始代码中给出.

皇上把折子一对一的仔细处理,找到给对应折子办事的人.

用户中断服务程序(ISR)

在用户中断服务程序(ISR)中,分为两种情况:

  • 第一种情况是不进行线程切换,这种情况下会进行任务中断上下文TaskIrqContext切换,用户中断服务程序和中断后续程序运行完毕后退出中断模式,返回被中断的线程。
  • 另一种情况是,在中断处理过程中需要进行线程切换,这种切换还会进行任务上下文TaskContext的切换.

具体下面办事的人把事办完.

中断嵌套

在允许中断嵌套的情况下,在执行中断服务程序的过程中,如果出现高优先级的中断,当前中断服务程序的执行将被打断,以执行高优先级中断的中断服务程序,当高优先级中断的处理完成后,被打断的中断服务程序才又得到继续执行,如果需要进行线程调度,线程的上下文切换将在所有中断处理程序都运行结束时才发生,如下图所示。

先把西施娘娘的事停了,现如花娘娘杀到,优先级高,老奴安排皇上先办如花娘娘,再接着办西施娘娘.奴才担心皇上这身子骨吃不吃得消.

中断共享

当外设较少时,可以实现一个外设对应一个中断号,但为了支持更多的硬件设备,可以让多个设备共享一个中断号,共享同一个中断号的中断处理程序形成一个链表。当外部设备产生中断申请时,系统会遍历执行中断号对应的中断处理程序链表直到找到对应设备的中断处理程序。在遍历执行过程中,各中断处理程序可以通过检测设备ID,判断是否是这个中断处理程序对应的设备产生的中断。

简单一句话就是:共用一个折子,分别办多件事.

核间中断

属于SGI中断类型,对于多核系统,中断控制器允许一个CPU的硬件线程去中断其他CPU的硬件线程,这种方式被称为核间中断。核间中断的实现基础是多CPU内存共享,采用核间中断可以减少某个CPU负荷过大,有效提升系统效率。

typedef enum {//鸿蒙核间中断
    LOS_MP_IPI_WAKEUP,	//唤醒CPU
    LOS_MP_IPI_SCHEDULE,//调度CPU
    LOS_MP_IPI_HALT,	//停止CPU
} MP_IPI_TYPE;

可以看出CPU之间可以相互唤醒,调度,停止.

核间中断有点特殊,出现于多个皇上(CPU)的情况. 皇上之间可以相互使唤,停止工作.比如:A皇上通过海公公让B皇上休息.

功能API

功能分类接口名描述
创建和删除中断LOS_HwiCreate中断创建,注册中断号、中断触发模式、中断优先级、中断处理程序。中断被触发时,handleIrq会调用该中断处理程序
LOS_HwiDelete删除中断
打开和关闭所有中断LOS_IntUnLock打开当前处理器所有中断响应
LOS_IntLock关闭当前处理器所有中断响应
LOS_IntRestore恢复到使用LOS_IntLock关闭所有中断之前的状态
使能和屏蔽指定中断LOS_HwiDisable中断屏蔽(通过设置寄存器,禁止CPU响应该中断)
LOS_HwiEnable中断使能(通过设置寄存器,允许CPU响应该中断)
设置中断优先级LOS_HwiSetPriority设置中断优先级
触发中断LOS_HwiTrigger触发中断(通过写中断控制器的相关寄存器模拟外部中断)
清除中断寄存器状态LOS_HwiClear清除中断号对应的中断寄存器的状态位,此接口依赖中断控制器版本,非必需
核间中断LOS_HwiSendIpi向指定核发送核间中断,此接口依赖中断控制器版本和cpu架构,该函数仅在SMP模式下支持
设置中断亲和性LOS_HwiSetAffinity设置中断的亲和性,即设置中断在固定核响应(该函数仅在SMP模式下支持)

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

在这里插入图片描述

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN

在这里插入图片描述

OpenHarmony 开发环境搭建

图片

《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN

图片

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往在这里插入图片描述

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

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

相关文章

全国计算机二级C语言笔试试题及答案

一、选择题(每小题2分,共70分)   下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。 请将正确选项填涂在答题卡相应位置上,答在试卷上不得分。   (1)下列叙述中正确的是 A)线性表的链式存储结构与顺序存储结构所需要的存储空间是相同的 …

day06-SpringBootWeb请求响应

前言 在上一次的课程中,我们开发了springbootweb的入门程序。 基于SpringBoot的方式开发一个web应用,浏览器发起请求 /hello 后 ,给浏览器返回字符串 “Hello World ~”。 其实呢,是我们在浏览器发起请求,请求了我们的…

[Meachines] [Easy] Bastion SMB未授权访问+VHD虚拟硬盘挂载+注册表获取NTLM哈希+mRemoteNG远程管理工具权限提升

信息收集 IP AddressOpening Ports10.10.10.134TCP:22, 135, 139, 445, 5985, 47001, 49664, 49665, 49666, 49667, 49668, 49669, 49670 $ nmap -p- 10.10.10.134 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH fo…

Bonree ONE 3.0:全域可观测 运维新境界

2024年8月16日,备受瞩目的Bonree ONE 3.0产品发布会上海站在上海中心大厦隆重举行。此次发布会以”Take IT Easy“——全域可观测,运维新境界为主题,博睿数据正式发布了一体化智能可观测平台Bonree ONE 3.0版本。Bonree ONE 3.0凭借领先的全域…

超声波清洗机哪个品牌好用?值得入手的超声波清洗机品牌推荐

许多人初次使用超声波清洗机的场景,往往发生在眼镜店内。它能灵巧穿梭于眼镜鼻托等细微缝隙间,实现彻底清洁,成效显著。这不仅限于眼镜,各式小件物品同样能享受到这份深度洁净的待遇。尽管超声波清洗机或许并非日常生活中的绝对必…

LeetCode.80.删除有序数组中的重复项II

题目描述: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间…

【MySQL-23】万字总结<InnoDB引擎>——【逻辑存储结果&架构(内存结构,磁盘结构,后台线程)&事务原理&MVCC】

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Lin…

【nginx】详细详细超详细,包括编译安装nginx+升级+回滚+核心配置+高级配置+反向代理+Nginx Rewrite相关功能等等

理论部分: 企业高性能Web服务器Nginx是一个开源的、高性能的HTTP和反向代理服务器,同时也支持IMAP/POP3/SMTP协议。它由俄罗斯人Igor Sysoev开发,并在2004年以BSD-like协议发布。Nginx因其卓越的性能、稳定性、丰富的功能集以及简单的配置而…

连锁美业门店收银系统怎么选?什么样的美业系统好用?美业管理系统源码分享

通过“PCiPAD手机APP微信小程序”的便捷功能操作, 提升预约服务、 会员管理、 收银管理、 库存管理、 客勤维护、员工管理、 排班管理等流程效率, 让门店员工的工作重心回归到服务质量上。 ▲ 小程序 ▲ 手机APP ▲ PC管理后台

Aseembly(九)-[BX] Loop

正如本篇文章的标题所示:本篇文章主要是进行 [BX] 和loop的讲解 上篇文章我们讲述了 关于 自己去dosbox里面编写汇编程序并且一步一步的编译(masm) 链接(link) 然后进行debug的过程 ,也进行了一个关于栈的实验: 详情请见我的上一篇文章 Aseembly(八)-汇编语言编写程序 让我们…

JavaScript class和正则

正则表达式练习 出生日期 年 月 日 ()表示一个整体 console.log(1909.match(^19\\d{2}$)); console.log(2024.match(^20(([01][0-9])|(2[0-4]))$)); //年 console.log(1909.match(^(19\\d{2})|(20(([01][0-9])|(2[0-4])))$)); // 月 console.log(12.match(^(0[1-9])|(1[0-2])…

minio版本升级与数据迁移操作记录

系列文章目录 minio单节点与集群安装 文章目录 系列文章目录前言一、问题引出二、升级与数据迁移步骤0.资源清单1.部署及启动新minio单实例2.设置新旧实例的别名3.检查旧实例bucket及存储的文件4.通过mc客户端命令进行数据迁移5.迁移结果验证 三、新旧实例minio数据对比 前言 …

利用Geohash算法,快速检索周边兴趣点

文章目录 一、前言二、基本原理三、Geohash算法四、算法存在的问题五、代码实现六、问题解决处理 一、前言 需要一个需求,查找某小区附近的超市,如果该小区和超市距离在500米以内,则查找成功。 实现该功能按照传统方式,需要获取小…

【秒杀系统架构图】

文章目录 高并发防止超卖和恶意请求定时同步商品用户秒杀的流程秒杀服务的关注点: 秒杀系统一般出现正在电商平台中,秒杀系统需要支持高并发,保持一致性和高可用的特点: 高性能。 秒杀涉及大量的并发读和并发写,因此支…

QT:事件机制

一、事件机制 qt的核心机制:对象树、信号和槽、事件机制 1.1概念 就是当这件事情发生时,自动执行对应的功能代码。该某块功能代码是虚函数,只需重写该虚函数,即可执行重写的代码。 1.2事件处理简介 1. 什么是事件? (重…

algorithm算法库学习之——堆操作,最小/最大操作,比较操作,排列操作

algorithm此头文件是算法库的一部分。本篇介绍堆操作,最小/最大操作,比较操作,排列操作。 接口API 堆操作 is_heap 检查给定范围是否为一个最大堆 (函数模板) is_heap_until (C11) 查找能成为最大堆的最大子范围 (函数模板) make_heap 从一…

SQL 时间盲注 (injection 第十六关)

简介 SQL注入(SQL Injection)是一种常见的网络攻击方式,通过向SQL查询中插入恶意的SQL代码,攻击者可以操控数据库,SQL注入是一种代码注入攻击,其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&#x…

C:每日一题:双指针法的使用

前言: 思虑再三,觉得如果有时间每日一题还是可以更新一下的。 题目难度:基础 解题方法:双指针法 一、题目 输入一个整数数组, 实现一个函数来调整该数组中数字的顺序使得 数组中所有的奇数位于数组的前半部分&a…

数字人的形象克隆与语音克隆是伪需求

形象克隆与语音克隆技术,在当前的环境上已经可以成熟的实现,但真的解决了痛点问题吗? 普通人或者一般的公司克隆自己内部人的形象有必要吗?对外界而言,克隆的形象与虚拟的形象并无二致,本身并没有什么知名…

Arduino自制手持小风扇项目

1.1 介绍: 实验功能说明:功能(1)按一下按键小风扇开启,再按一下关闭。 功能(2)按一下按键小风扇一档风速,再按一下二挡,依次三挡…关闭。 按键模块说明:按下…