操作系统的心脏节拍:CPU中断如何驱动内核运转?

server/2025/3/22 20:58:37/

目录

一、硬件中断

二、时钟中断

三、软中断

四、用户态与内核态


一、硬件中断

为引出今天的话题,我们来思考这样一个问题:

#include<stdio.h>
int main()
{int a;scanf("%d",&a);return 0;
}

        当以上程序执行到scanf时,如果我们不输入信息,程序会一直阻塞在这里。那程序如何知道我们已经完成输入了呢?而且我们输入的信息在外设上,程序又是如何知道何时将其载入内存的呢?

        这其实是由外设就绪后通知给CPU,再由CPU通知给操作系统,然后由操作系统调用最后通知给前台程序。具体细节如下:

        每个中断都有自己的编号,即中断号,在中断控制器中会有寄存器来记录已就绪的中断号。一旦有外设就绪,它的中断号将被存入寄存器,然后由中断控制器通知CPU。CPU得到信息后会从中断控制器的寄存器中获取中断号,并停止当前工作,保持好当前数据(保存上下文),然后通知操作系统执行对应的中断方法。处理完后,CPU恢复现场,继续之前的工作。

如上图所标记的执行顺序:1,2,3,4,5,6,7。

        我们都知道CPU运行速度非常快,外设的数据不能直接与CPU打交道,而是要通过存储器作为桥梁。注意这只是说外设的数据不与CPU打交道,不代表外设就不与CPU打交道,如下冯·诺伊曼体系结构:

        OS(操作系统)中储存了各种处理中断的不同方法,通过上面的执行逻辑我们可以知道,OS并不需要关心外设是否就绪,只需要等待CPU通知即可。

像这样由硬件产生的中断叫硬件中断,同理就有软件中断。下文会细讲。

二、时钟中断

        我们回顾一下,操作系统是一个对软硬件进行管理的软件,它的工作通常包括:进程调度,为程序提供系统调用。

        其实操作系统做的所有工作都是一种中断处理。

那么当没有中断需要处理时,操作系统在做什么?

        这个时候操作系统什么也不干,就暂停在那里。对,你没听错,操作系统也是牛马啊!CPU没给它派发中断任务,它就只管闲着就好。

OS做的任何工作都是对中断的处理,那么OS进行进程调度也是收到中断信号吗?

        是的!除了以上讲的外设会生成中断信号以外,还有一个特殊的设备:“时钟源”,它被集成在CPU内部,会以特定的频率CPU发送中断,这也就是时钟中断。

        OS在接收到时钟中断信号后,更新当前进程的时间片,并检查时间片是否耗尽(即计数器是否为0)。如果已经耗尽,则进行进程调度,如果没有,则无需任何操作。

注意:时钟中断的频率是固定的,而进程的时间片是根据具体情况动态调整的。

总结:操作系统是基于中断机制进行工作的软件。

三、软中断

        除了硬件产生中断以外,在程序中写的系统调用也会产生中断,我们把这种由软件触发的中断叫作软中断。

也就是说CPU也可以主动的触发中断,并不一定是由硬件触发。

        缺⻚中断?内存碎⽚处理?除零野指针错误?这些问题,全部都会被转换成为CPU内部的软中断,然后执行中断处理例程,完成所有处理。有的是进⾏申请内存,填充⻚表,进⾏映射的。有的是⽤来处理内存碎⽚的,有的是⽤来给⽬标进程发送信号,杀掉进程等等。

又比如在处理系统调用产生的中断方法中,有着这样一张表:

        它实际上是一个函数指针数组,储存了各种系统调用方法。 所以每一个系统调用都有唯一的下标,这个下标也叫作系统调用号

        但我们会发现这些函数好像都没用过,然而名字却有些熟悉。确实,我们并不会直接调用这里的函数,而是使用fork,read,write,open等。也就是说我们平常所用的这些函数并非真正意义上的系统调用,而是在系统调用的基础上进行封装的。OS把它做得这么复杂也是为了自我保护。

比如我们用的read函数里面封装了这样的汇编代码:

int 0x80 
move eax 5
  • int 0x80:让CPU产生软中断,也可以通过syscall触发
  • move eax 5:把read的系统调用号5存入寄存器。

通过int 0x80找到这样的中断方法:

void CallSystem()
{//获取系统调用号int n = 0;move n eax//... ...//系统调用方法sys_call_table[n]();}

四、用户态与内核态

        虚拟地址空间分为两大部分,其中1GB是内核区,3GB是用户区。不同的PCB虚拟地址空间的用户页表是不同的,但是它们的内核页表是相同的。如下:

        这也说明,无论操作系统怎么切换进程,都能通过内核区找到同一个操作系统。即操作系统调用方法的执行是在进程的地址空间中进行的。

        而进程执行的本质也是在地址空间上跳转,那么用户在写程序时不就可以直接去内核地址空间访问内核了吗。

        这样的情况确实可以实现,因此为保护操作系统内核安全,就引入了一系列的权限机制。

        比如用户态内核态就是一种权限,在CPU中存在一个寄存器CPL标记当前所处的权限,0表示内核态,3表示用户态。

        在进行系统调用时就需要进行权限的更改,比如int 80或syscall在触发中断时也进行权限的更改,使其陷入内核。

非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!74c0781738354c71be3d62e05688fecc.png


http://www.ppmy.cn/server/177136.html

相关文章

【软考-架构】8.4、信息化战略规划-CRO-SCM-应用集成-电子商务

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 信息化战略体系&#x1f4af;考试真题第一题第二题 信息系统战略规划&#x1f4af;考试真题第一题第二题 ✨客户关系管理CRM供应链管理SCM&#x1f4af;考试真题第一题第二…

HTML语言的贪心算法

HTML语言的贪心算法&#xff1a;理论与实践 引言 在编程和算法研究中&#xff0c;贪心算法是一种广泛应用的解决问题的方法。它通过对每一阶段选择最优解的方式来构建整个问题的解决方案。贪心算法不一定能在所有情况下得到最优解&#xff0c;但在许多实际问题中&#xff0c;…

计算机网络:(二)计算机网络在我国发展与网络类别与性能 (附带图谱更好对比理解)

计算机网络&#xff1a;&#xff08;二&#xff09;计算机网络在我国发展与网络类别和性能 前言一、计算机网络在我国的发展二、计算机网络的类别1. 计算机网络的定义2. 不同类别的计算机网络&#xff08;1&#xff09;按覆盖范围分类&#xff08;2&#xff09;按传输技术分类…

DeepSeek面试——模型架构和主要创新点

本文将介绍DeepSeek的模型架构多头潜在注意力&#xff08;MLA&#xff09;技术&#xff0c;混合专家&#xff08;MoE&#xff09;架构&#xff0c; 无辅助损失负载均衡技术&#xff0c;多Token 预测&#xff08;MTP&#xff09;策略。 一、模型架构 DeepSeek-R1的基本架构沿用…

数据库主观题题库及答案

数据库主观题题库及答案 一、简答题 1. 简述数据库系统的三级模式结构以及两级映像的功能 题目: 简述数据库系统的三级模式结构以及两级映像的功能。 答案: 数据库系统的三级模式结构包括: 外部模式(视图):用户视角的数据库模式,每个用户可以有一个或多个视图。概念…

MySQL身份验证的auth_socket插件

在Ubuntu 20.04 LTS上&#xff0c;MySQL 8.0默认使用auth_socket插件进行身份验证&#xff0c;可能存在意想不到的情况。 一、auth_socket插件 在使用sudo mysql或通过sudo切换用户后执行任何MySQL命令时&#xff0c;不需要输入密码或错误密码都可以正常登入mysql数据库&…

玩转C#函数:参数、返回值与游戏中的攻击逻辑封装

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(10)

1.问题描述&#xff1a; 离线推送&#xff0c;锁屏的时候没有弹出消息&#xff0c;只有下拉在通知中心里面显示。请问是否是正常的&#xff1f; 解决方案&#xff1a; 检查一下是否存在图片风控&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-referen…