【现代操作系统】3. 中断、异常、系统调用

news2024/11/14 20:38:26

通用概念

  • 中断(Interrupt)
    • 外部硬件设备所产生的信号
    • 异步:产生原因和当前执行指令无关,如程序被磁盘读打断
  • 异常(Exception)
    • 软件的程序执行而产生的事件
    • 包括系统调用
    • 同步:产生和当前执行或试图执行的指令相关
  • 系统调用
    • 是一种特殊的异常
    • 操作系统里面要主动实现的异常
    • 用户程序请求操作系统提供服务

不同体系结构术语的对应关系

在这里插入图片描述

Aarch64的中断(异步异常)

  • 重置(reset)
    • 最高级别的异常,用以执行代码初始化CPU核心
    • 由系统首次上电或控制软件、Watchdog等触发
  • 中断(Interrupt)
    • CPU外部的信号触发,打断当前执行
    • 如计时器中断、键盘中断等

Aarch的(同步)异常

  • 中止(Abort)
    • 失败的指令获取或数据访问
    • 如访问不可读的内存地址等
  • 异常产生指令(Exception generating Instruments)
    • SVC: 用户程序->操作系统
    • HVC: 客户用户程序->虚拟机管理器
    • SMC: Normal World->Secure World

X86-64术语

  • 中断(设备产生、异步)
    • 可屏蔽:设备产生的信号,通过中断控制器与处理器相连,可被暂时屏蔽(如键盘、网络事件)
    • 不可屏蔽:一些关键硬件的崩溃(如内存校验错误)
  • 异常(软件产生、同步)
    • 错误(Fault):如缺页异常(可恢复)、段错误(不可恢复)等
    • 陷阱(Trap): 无需恢复,如断点(int3)、系统调用(int 80)
    • 中止(Abort):严重的错误,不可恢复(机器检查)

中断的产生

中断控制器

ARM SOC的结构,里面可以看到很重要的一块GIC(通用中断控制器)
ARM  SOC的结构
GIC连出很多根线,和各种设备进行了连接,同时也有一根线和CPU(core)进行了连接
GIC在这里相当于是中断源的处理,它把各个设备发出的中断汇集到GIC这里,再有GIC决定这个中断是发给哪个CPU还是外设

  • 中断控制器需要考虑的问题
    • 如何指定不同中断的优先级
    • 中断交给谁处理
    • 如何与软件协同

AArch64中断的分类

在这里插入图片描述

不同ARM GIC的实现

  • 早期的ARM中断控制器
    • 厂商制定模型
    • 向量中断控制器VIC
      • ARM提出
      • 放在AMBA告诉总线上
      • 32种非向量中断(不同中断相同的处理入口)
      • 16种向量中断(不同中断不同的处理入口)
    • 现在->GIC:通用中断控制器
      • 中断类型变多,将中断分发给不同的核(对称或非对称)进行处理
      • 主要功能
        • 分发:管理所有中断、决定优先级、路由
        • CPU接口:给每个CPU核有对应的接口

GIC中断来源分类

GIC有很多版本,这里以下图这种举例
在这里插入图片描述

  • SPI:共享外围中断
    • 可以被路由到一个或多个核,找到可用的核进行处理
    • Distributor可配置路由
    • 如UART中断(可以配置由哪个核处理)
    • 中断ID:32~1019
  • PPI:私有外围中断
    • 对每个CPU都有一个PPI,所以可以指定核处理(是私有的,每个CPU都可以有自己的PPI)
    • Distributor可配置路由
    • 如WatchingDog -> A5 core
    • 中断ID:16~31
  • SGI:软件产生中断
    • 核间通信(如多处理器的情况下,一个CPU往另一个CPU发一个跨处理器的中断)
    • 中断ID:0~15
    • NT:虽然是由软件发出的,但也是异步的,因为发给另外一个处理器B后,处理器B什么时候处理它和中断处理的过程是有关系的

GIC的路由配置——以ChCore启用timer为例

#define GICD_ISENABLER (KBASE+0xE82B1100//定义GIC enable对应的地址:Kernel base+偏移

void plat_interrupt_init(void)		// 进行Interrupt的初始化
{
	u32 cpuid = smp_get_cpu_id();
	if(cpuid == 0)
		gicv2_dist_init();
	
	gicv2_cpu_init();
	
	/* 启用timer */
	put32(GICD_ISENABLER, 0x08000000);		
	// 往中断控制器中写一个enable的值(这里实际上是某一个位置成了1)
	timer_init();
}

使用MMIO,设置GIC中寄存器,启用timer

put32对应指令:

BEGIN_FUNC(put32)
	str w1, [x0]
	ret
END_FUNC(put32)

GIC中断信息获取

如:如何handle irq
这里对应已经从中断向量表里跳到了这个函数

void plat_handle_irq(void)
{
	u32 cpuid = 0;
	unsigned int irq_src, irq;

	cpuid = smp_get_cpu_id();
	irq_src = get32(core_irq_source[cpuid]);  //从中断向量表里获取信息

	irq = 1 << ctzl(irq_src);
	switch(irq){
	case INT_SRC_TIMER3:
		handle_timer_irq();
		break;
	default:
		kinfo("Unsupported IRQ %d\n", irq);
	}
	return;
}

使用MMIO,从GIC中的寄存器里获得中断信息

内存映射输入输出

Memory-Mapped I/O,MMIO,是一种常见的CPU控制和访问设备的方式
原理:把输入输出设备和物理内存放到同一块地址空间,为设备内部的内存和寄存器也分配相应的地址
当CPU通过MMIO方式为一个设备分配了地址之后,CPU可以使用和访问物理内存一样的指令(ldr和str)来访问设备的地址;设备通过总线监听CPU分配给自己的地址,然后完成CPU访问请求
Aarch64将MMIO作为CPU访问设备的重要方式

轮询与中断

->CPU获取有输入事件发生
通过MMIO方式获取树莓派上的异步收发传输器(UART)为例,OS获取输入的可能方式:

  • 轮询:CPU不断通过MMIO查看UART是否有输入
  • 中断:UART收到输入后,打断CPU正常执行,CPU再从UART获取输入

中断机制除了使得设备能主动通知CPU外,还包括让一个CPU核心去通知另一个CPU核心

MMIO使CPU可以主动访问设备,中断使设备能主动通知CPU->CPU与设备之间交互的重要方式

中断处理不能做太多事情

做太多事情会使处理效率非常低
因为中断在处理时CPU是不能做其他事情的,且其他任务也在等着这个中断的处理

  • 解决方案
    • 将几个中断一起处理,减少整体中断占用时间(如网卡,一次中断将多个数据一起读上来)
    • delay,推迟执行(但是要注意delay什么,尤其是硬件,随意delay会出问题)(比如delay了一个中断,时间有点长的话会丢失一部分数据,用户明显会感受到卡顿)

案例:Linux的中断处理理念

  • 在中断处理中做尽量少的事情
  • 推迟非关键行为
  • 结构:Top half & Bottom half
    • Top half:做最少得工作后返回(如在中断处理里面,收到中断后可能将相关的数据先放置,标记信号已经收到,先回复信号发出者信号已经收到了)(比如到达目的地后先报平安,再去找酒店)
    • Bottom half:推迟处理(softirq, tasklets, 工作队列,内核线程)
      在这里插入图片描述
  • Top Half:马上做
    • 最小的、公共行为
      • 保存寄存器,屏蔽其他中断
      • 恢复寄存器,返回原来场景
    • 最重要:调用合适的由硬件驱动提供的中断处理handler
    • 因为中断被屏蔽,所以不要做太多事情(时间、空间)
    • 使用将请求放入队列,或者设置标志位将其他处理推迟到Bottom half

…未完待更…

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

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

相关文章

【AI学习】LLaMA模型的微调成本有几何?

在前面文章《LLaMA 系列模型的进化&#xff08;二&#xff09;》中提到了Stanford Alpaca模型。 Stanford Alpaca 基于LLaMA (7B) 进行微调&#xff0c;通过使用 Self-Instruct 方法借助大语言模型进行自动化的指令生成&#xff0c;Stanford Alpaca 生成了 52K 条指令遵循样例数…

【数据结构与算法】穷举搜索

穷举搜索目录 一.穷举搜索的原理二.穷举问题的引入三.穷举搜索的实现四.穷举搜索的高效版 一.穷举搜索的原理 列出所有可能出现的情况,逐个判断有那些是符合问题要求的条件. 通常可以从两方面分析: 问题所涉及的情况答案需要满足的条件 二.穷举问题的引入 有20枚硬币&#…

电价预测 | TSOA-TCN-Attention凌日算法优化时序卷积神经网络电价预测

目录 效果一览基本介绍程序设计 效果一览 基本介绍 电价预测 | TSOA-TCN-Attention凌日算法优化时序卷积神经网络电价预测 电价预测需求&#xff1a;随着能源市场的开放和电力交易的增加&#xff0c;准确的电价预测对于市场参与者的决策至关重要。而时序数据中的规律和趋势对于…

中小型制造企业质量管理设计与实现

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

多线程并行

多线程并行、所有线程结束后输出任务完成 示例 package com.fd;import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger;public class Test3 {public static void main(String[] args) throws InterruptedException {AtomicInteger counter…

【数据结构入门】二叉树之堆的实现

文章目录 前言一、树1.1 树的概念1.2 树的相关概念 二、二叉树2.1 二叉树的概念2.2 特殊的二叉树2.3 二叉树的性质 三、堆3.1 堆的概念3.2 堆的性质3.3 堆的存储3.4 堆的实现3.4.1 堆的初始化3.4.2 堆的销毁3.4.1 堆向上调整算法3.4.2 堆向下调整算法3.4.3 堆的创建3.4.4 堆的插…

MT2523AS 原边10瓦无外围方案PCB设计要点

MT2523AS 是自供电原边反馈5V2A(10瓦)电源芯片。MT2523AS 内置功率三极管&#xff0c;采用脉冲频率调制&#xff08;PFM&#xff09;建立非连续导电模式&#xff08;DCM&#xff09;的反激式电源&#xff0c;外围设计极简化。MT2523AS 具有可变原边峰值电流&#xff0c;通过最大…

AI技术在招聘人才笔试测评中的作用

一、引言 在快速变化的商业环境中&#xff0c;企业之间的竞争日益激烈&#xff0c;而人才作为企业发展的核心驱动力&#xff0c;其选拔与培养显得尤为重要。传统的人才招聘流程&#xff0c;尤其是笔试测评环节&#xff0c;往往依赖于人工阅卷、主观判断&#xff0c;不仅效率低…

每日一问:深入理解JVM——结构与类的加载过程解析

每日一问&#xff1a;深入理解JVM——结构与类的加载过程解析 在Java的世界中&#xff0c;JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;是一个核心概念。它是Java程序能够跨平台运行的基础&#xff0c;负责执行Java字节码&#xff0c;并为Java应用程…

成为Python砖家(3): 何时产生字节码 .pyc 文件

好奇&#xff1a;.pyc和 __pycache__是啥&#xff1f; 你是否好奇&#xff0c;在某些 Python 工程中&#xff0c;当执行了 xxx.py脚本后&#xff0c;多出了 __pycache__目录&#xff1f;这个目录下存放的是一些 .pyc结尾的文件。 这些文件&#xff0c;叫做 python bytecode。 …

电子信息工程专业学习路线的制定与实践

电子信息工程专业是一个多学科交叉、技术更新迅速的领域。对于大学生来说&#xff0c;制定合适的学习路线并有效学习专业知识至关重要。 目录 一、明确学习目标 二、构建知识体系 三、掌握基础知识 四、深入专业课程 五、实践与理论相结合 六、学习编程语言 七、参与科研…

345345

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

数学建模起步感受(赛前15天)

0基础直接上手数模&#xff0c;因为大一&#xff01;年轻就是无所畏惧&#xff01;开个玩笑&#xff0c;因为数模比赛比一年少一年… 抱着不打也是浪费的态度&#xff0c;我开始着手准备 首先python啥也不会&#xff0c;知道有元组这玩意… 仅仅在刷软考题的时候遇到python选择…

[数据集][目标检测]竹子甘蔗发芽缺陷检测数据集VOC+YOLO格式2953张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2953 标注数量(xml文件个数)&#xff1a;2953 标注数量(txt文件个数)&#xff1a;2953 标注…

计算机Java项目|基于SpringBoot的医疗报销系统的设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

【深入浅出Docker】【三】Docker容器详解

文章目录 一. Docker容器简介二. Docker容器详解1. 容器vs虚拟机1.1. 虚拟机模型1.2. 容器模型1.3. 虚拟机的额外开销 2. 容器启动过程描述3. 容器进程4. 容器生命周期与文件保存5. 优雅地停止容器&#xff1a;两阶段方式停止并删除容器6. 利用重启策略进行容器的自我修复6.1. …

MobileFormer 网络简介

MobileFormer&#xff1a;一种通过双线桥将 MobileNet 和 Transformer 并行的结构。这种方式融合了 MobileNet 局部性表达能力和 Transformer 全局表达能力的优点&#xff0c;这个桥能将局部性和全局性双向融合。和现有 Transformer 不同&#xff0c;Mobile-Former 使用很少的 …

或许改变整个领域的生态!颜宁团队合作最新Cell子刊

电压门控钠(Nav)和钙(Cav)通道负责电信号的起始。长期以来&#xff0c;它们一直是治疗各种疾病的靶标。来自多种生物的Nav和Cav通道的不同亚型的冷冻电镜(cryo-EM)结构越来越多&#xff0c;需要一个通用的残基编号系统来建立结构-功能关系&#xff0c;并有助于合理的药物设计或…

java(基础)

Arrays.toString 依赖于 java.util.* Pearson出版社 Java优势 1 ) 简单性 2 ) 面向对象 3 ) 分布式 4 ) 健壮性 5 ) 安全性 7 ) 可移植性 可移植性指的是 Java 程序可以在不同的操作系统、硬件平台和设备上运行 8 ) 解释型 9 ) 高性能 10 ) 多线程 11 ) 动态性 6 )…

打字侠支持新世纪五笔、86版五笔、98版五笔打字练习:初学者的最佳选择

在当今数字化时代&#xff0c;打字已经成为我们日常生活和工作中必不可少的一部分。尽管拼音输入法因其易学易用的特点占据了主导地位&#xff0c;但对于那些追求高效打字和提高汉字输入速度的人来说&#xff0c;五笔输入法仍然是一种极具吸引力的选择。无论是新世纪五笔、86版…