Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Linux内核18-中断和异常的嵌套处理

Linux内核18-中断和异常的嵌套处理

作者头像
Tupelo
发布于 2022-08-15 07:49:31
发布于 2022-08-15 07:49:31
2.2K0
举报
文章被收录于专栏:嵌入式ARM和Linux嵌入式ARM和Linux

讲解这部分之前,我们先阐述一个概念-内核控制路径:就是一段在内核态执行的代码,比如说,异常处理程序,中断处理程序,系统调用处理,内核线程等等在内核态执行的代码。所以,内核态程序被激活的方式有:

  1. 系统调用(异常的一种)
  2. 异常
  3. 中断
  4. 内核线程

上面的任意一种方式,都可以让CPU执行内核态的代码。比如,I/O设备引发一个中断,相应的内核态程序,首先,应该是保存内核态堆栈中的CPU寄存器的内容;然后,执行中断处理程序;最后,再恢复这些寄存器的内容。所以,在后面的描述中,我们使用内核控制路径这个术语代替一段可执行的内核态代码这种表述。使用内核控制路径的好处就是,它是从英语直译过来的,可能会更好地表达程序代码执行的顺序性,是一个过程;这样在描述中断嵌套时更有意义。

内核控制路径可以任意嵌套;如下图所示,用户态的程序被中断打断,进入内核态响应中断;而这时候又来了其它中断,就会响应最新的中断,以此类推;但是,执行完一个中断处理程序之后,会回到之前的状态执行。这样,最后又回到了用户态。

图4-3 内核控制路径的一个嵌套异常的示例

允许内核控制路径嵌套的代价就是中断处理程序不能阻塞,也就是说,中断处理程序运行时不能发生进程切换。恢复执行嵌套内核控制路径的所有数据都存储在内核态堆栈中,而该堆栈又和当前进程紧紧绑定在一起。通俗的说,中断处理程序相当于当前进程的资源,切换进程之前该中断资源必须释放掉。

假设内核没有bug,那么大部分的异常发生在用户态。实际上,要么是编程错误,要么是调试器故意触发的。而页错误异常发生在内核态,它是内核在访问物理地址时不存在引发的异常。处理这样的异常,内核挂起当前进程,切换到新进程,直到该请求页可用。因为页错误异常绝不会引发进一步的异常,所以,有关联的内核控制路径最多是2个(第一个是系统调用造成的,第二个是页错误造成的)。也就是说,页错误的异常最多嵌套2层。

和异常相反,尽管内核代表当前进程处理这些中断,但是,I/O设备引发的中断和当前进程没有直接数据引用的关系。事实上,给定一个中断,无法推断出是哪个进程在运行。所以,中断的执行不会引起进程的切换,也就可以无限嵌套处理。

中断处理程序可以打断中断或异常处理程序执行,但是反过来,异常不能打断中断处理程序。中断处理程序绝对不能包含页错误的操作,因为这会诱发进程切换。

Linux嵌套执行中断或异常处理程序的两个主要原因是:

  • 为了提高可编程中断控制器和设备控制器的吞吐量。内核正在处理一个中断的时候,能够及时响应另一个中断。
  • 实现没有中断优先级的模型。这可以简化内核代码并提高可移植性。

在多核系统中,几个中断或异常处理程序可能会并发执行。更重要的是,异常处理程序可能由于进程切换,造成在一个CPU上启动,然后迁移到另一个CPU上执行。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式ARM和Linux 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux内核24-内核同步理解
我们可以把内核想象成一个服务器,专门响应各种请求。这些请求可以是CPU上正在运行的进程发起的请求,也可以是外部的设备发起的中断请求。所以说,内核并不是串行运行,而是交错执行。既然是交错执行,就会产生竞态条件,我们可以采用同步技术消除这种竞态条件。
Tupelo
2022/08/15
1.1K0
Linux内核20-Linux内核的异常处理过程
当异常发生时,Linux内核给造成异常的进程发送一个信号,告知其发生了异常。比如,如果一个进程尝试除零操作,CPU会产生除法错误异常,相应的异常处理程序发送SIGFPE信号给当前进程,然后由其采取必要的步骤,恢复还是中止(如果该信号没有对应的处理程序,则中止)。
Tupelo
2022/08/15
1.6K0
重学计算机组成原理(十二) - 异常和中断
一提到异常 (Exception),可能你的第一反应就是Java中的Exception。 不过我们今天讲的,并不是这些软件开发过程中遇到的“软件异常” 而是和硬件、系统相关 的“硬件异常”。
JavaEdge
2020/05/27
1.5K0
重学计算机组成原理(十二) - 异常和中断
Linux调度系统全景指南(上篇)
| 导语 本文主要是讲Linux的调度系统, 由于全部内容太多,分三部分来讲,调度可以说是操作系统的灵魂,为了让CPU资源利用最大化,Linux设计了一套非常精细的调度系统,对大多数场景都进行了很多优化,系统扩展性强,我们可以根据业务模型和业务场景的特点,有针对性的去进行性能优化,在保证客户网络带宽前提下,隔离客户互相之间的干扰影响,提高CPU利用率,降低单位运算成本,提高市场竞争力。欢迎大家相互交流学习!
刘盼
2021/03/10
1.6K0
Linux调度系统全景指南(上篇)
性能之cpu篇
对于性能来说,cpu的调度逻辑是影响性能的主要来源,本文主要来介绍下cpu跟性能相关的调度逻辑和排障工具。
灰子学技术
2022/04/27
7330
性能之cpu篇
中断和异常概念详解
CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。
一个会写诗的程序员
2022/01/27
1.6K0
中断和异常概念详解
重学计算机组成原理(十二) - 异常和中断
一提到异常 (Exception),可能你的第一反应就是Java中的Exception。 不过我们今天讲的,并不是这些软件开发过程中遇到的“软件异常” 而是和硬件、系统相关 的“硬件异常”。
JavaEdge
2019/10/21
9780
重学计算机组成原理(十二) - 异常和中断
Linux内核17-硬件如何处理中断和异常
在上一篇文章中,我们已经了解了中断和异常的一些概念,对于中断和异常也有了大概的理解。那么,系统中硬件到底是如何处理中断和异常的呢?本文我们就以常见的X86架构为例,看看中断和异常的硬件工作原理。
Tupelo
2022/08/15
2.1K0
Linux内核17-硬件如何处理中断和异常
Linux中断一网打尽(1) —— 中断及其初始化
既然叫中断, 那我们首先就会想到这个中断是中断谁?想一想计算机最核心的部分是什么?没错, CPU, 计算机上绝大部分的计算都在CPU中完成,因此这个中断也就是中断CPU当前的运行,让CPU转而先处理这个引起中断的事件,通常来说这个中断的事件比较紧急,处理完毕后再继续执行之前被中断的task。比如,我们敲击键盘,CPU就必须立即响应这个操作,不然我们打字就全变成了慢动作~。说白了中断其实就是一种主动通知机制,如果中断源不主动通知,那想知道其发生了什么事情,只能一次次地轮询了,白白耗费CPU。
扫帚的影子
2020/02/25
1.7K0
Linux中断一网打尽(1) —— 中断及其初始化
CPU 用户态切换到内核态的触发机制详解
现代计算机系统基于分层结构运行,最重要的两层是用户态(User Mode)和内核态(Kernel Mode)。用户态用于运行用户应用程序,而内核态则是操作系统的工作空间,管理硬件资源和提供系统服务。CPU 进入内核态的过程是操作系统安全性和稳定性的核心,本文将详细探讨有哪些指令和操作会导致 CPU 从用户态切换到内核态。
编程小妖女
2025/01/16
2060
CPU 用户态切换到内核态的触发机制详解
中断和异常
异常通常分为2类:一类是编程错误,另外一类就是需要内核处理的异常情况。编程错误,比如程序异常终止,处理这种异常,内核只需要给当前进程发送一个信号即可。而需要内核处理的异常,比如页错误、通过汇编语言指令比如int或sysenter等请求内核服务等,需要内核作出相应的处理。
Tupelo
2022/08/15
1.5K0
【操作系统】操作系统运行环境——中断与异常
在上一篇内容中我们介绍了处理器的运行模式。在计算机系统中,CPU通常会执行两种不同性质的程序:
蒙奇D索隆
2024/12/20
1800
【操作系统】操作系统运行环境——中断与异常
Linux内核37-内核数据的同步访问
每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。
Tupelo
2022/08/15
9380
Linux内核19-中断描述符表IDT的初始化
至此,我们已经理解了X86架构如何在硬件层面如何处理中断和异常,那么接下来,我们看看Linux内核管理这些中断和异常。
Tupelo
2022/08/15
9580
一文搞懂操作系统的用户态与内核态
在计算机科学中,操作系统是管理计算机硬件与软件资源的核心软件,它负责分配和调度计算机资源,提供各种服务以支持应用程序的运行。操作系统中的用户态和内核态是两个重要的概念,它们定义了应用程序和操作系统之间的交互方式。这篇文章我们将详细解释这两个概念,以及它们在操作系统中的作用和意义。
闫同学
2023/12/24
5.2K0
Linux操作系统分析复习
OS的正常工作依赖于存储程序原理、堆栈、中断三个部分。 linux内核从一个初始化上下文环境的函数开始执行,即start_kernel函数,创建多个进程或者fork(创建一个与原来进程几乎完全相同的进程)若干进程,我们为每个进程维护一个进程描述和以及进程间的关系PCB。 当中断发生的时候,如mykernel中就是时钟中断发生之后,接下来OS就会为各进程进行调度,利用Swich_to函数在调度队列中选取出一个适合的进程(系统会根据中断向量号来调用相应的中断异常程序)。由CPU和内核堆栈保存当前进程的各寄存器信息(CPU要做两件工作,一是将当前的eip和esp压入到当前进程的内核栈,二是将esp指向当前进程的内核栈,并将eip指向中断处理入口,进入到内核态。),将eip指向要调度的进程执行的代码区,开始执行。
matt
2022/10/25
7830
Linux操作系统分析复习
中断与异常简介与分析
在高执行级别下,代码可以执行特权指令,访问任意的物理地址,这种CPU执行级别就对应着内核态。
杨源鑫
2019/07/04
1.2K0
中断与异常简介与分析
Linux内核21-Linux内核的中断处理过程
如前所述,我们知道异常的处理还是比较简单的,就是给相关的进程发送信号,而且不存在进程调度的问题,所以内核很快就处理完了异常。
Tupelo
2022/08/15
2.5K0
Linux内核21-Linux内核的中断处理过程
中断机制和中断描述符表、中断和异常的处理
该文介绍了中断和异常的基本概念、分类,以及Linux 中中断和异常的处理方式,包括硬件中断、软件中断和异常的分类和处理。
s1mba
2017/12/28
3.9K0
中断机制和中断描述符表、中断和异常的处理
操作系统用户态和内核态之间的切换过程是什么_用户进程从用户态切换到内核态
究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子:
全栈程序员站长
2022/09/30
2.4K0
操作系统用户态和内核态之间的切换过程是什么_用户进程从用户态切换到内核态
相关推荐
Linux内核24-内核同步理解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档