(1)处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令
(2)处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令
cpu怎么判断出指令的类型的?
CPU 判断指令类型的过程主要依赖于 指令解码(Instruction Decoding),其核心是通过解析指令的二进制编码来识别操作类型和操作数。例如:
操作码 ADD
可能对应二进制 000001
,JUMP
对应 010101
。
cpu能判断出指令的类型,但是如何区分此时运行的程序是内核程序还是用户程序?
拓展:cpu中有一个寄存器叫做程序状态寄存器(psw),其中有个二进制位,1表示内核态,0表示用户态。
别名:内核态=核心态=管态;用户态=目态
用户态与内核态的切换通过硬件中断、系统调用或异常触发,依赖 CPU 的上下文保存/恢复机制和操作系统的中断处理逻辑。这一过程确保了系统资源的安全访问和高效管理,是现代操作系统的核心基础之一。
内核态----用户态:一条psw的特权指令
用户态---内核态:由中断引起,硬件自动完成
1.中断的分类
触发源:由硬件设备发起(如键盘、磁盘、网卡)。
类型:
可屏蔽中断(Maskable Interrupt):可通过CPU标志位(如x86的IF位)暂时屏蔽(如网络数据包处理)。
不可屏蔽中断(NMI):必须立即处理(如硬件故障、内存校验错误)。
触发源:由程序执行特定指令或发生异常引发。
异常(Exception):CPU执行指令时的错误或特殊状态(如缺页异常、除零错误)。
系统调用(System Call):用户程序主动请求内核服务(如文件读写)。
-----执行”陷入指令“,陷入:程序故意引发的,特殊的指令,程序主动把CPU的特权还给操作系统
陷入指令=trap指令=访管指令
特性 | 中断(Interrupt) | 陷阱(Trap) |
---|---|---|
触发时机 | 异步(随时发生) | 同步(由程序执行触发) |
典型场景 | 硬件事件(如时钟中断) | 系统调用、断点调试 |
返回行为 | 通常返回到中断后的下一条指令 | 可能修改程序流程(如异常处理) |
系统调用(System Call) 是操作系统内核提供给用户程序(应用程序)的接口,允许程序通过内核访问计算机的底层硬件和资源(如文件、网络、进程、内存等)。它是用户程序与操作系统之间的桥梁。
操作系统需要管理和保护硬件资源,避免用户程序直接操作硬件可能导致的冲突或安全问题。例如:
程序无法直接读写磁盘,必须通过系统调用请求内核代为操作。
程序无法直接创建新进程,需通过系统调用委托内核完成。
程序如果并发执行,需要系统调用解决冲突问题,并且因为资源是有限的,所以需要共享,为了解决冲突问题,需要系统调用。
易错:
(1)传参指令 -->陷入指令”用户态“(会内引发中断)->”内核态“ 其他指令
(2)发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行
你:用户程序(比如一个App)。
服务员:系统调用接口。
厨房:操作系统内核(唯一能直接操作硬件的地方)。
你想点一份炸鸡(比如想读取文件),但你不能直接进厨房炸鸡,必须通过服务员下单。
用户程序:调用一个函数(比如 read()
读取文件)。
就像:你在手机App里点击“下单炸鸡”。
CPU切换模式:从用户态(普通权限)切换到内核态(最高权限)。
就像:服务员收到订单后,拿着你的需求进入厨房(只有厨房有设备和权限做炸鸡)。
内核:根据你的请求类型(比如系统调用号 SYS_read
),操作硬件(比如从硬盘读取文件)。
就像:厨房根据订单开始炸鸡,用油锅(硬件)加工食材。
内核完成操作:把结果(比如文件内容)返回给用户程序。
CPU切换回用户态:退出内核态,恢复用户程序的执行。
就像:服务员把炸鸡打包好,从厨房出来交给你,然后继续处理其他顾客需求。
用户程序:拿到数据后继续执行后续代码。
就像:你拿到炸鸡开始吃,继续玩手机。
为什么不能直接进厨房?
安全!如果每个顾客都能随便用油锅,厨房会着火(系统崩溃)。
统一管理:服务员(内核)确保订单按顺序处理,避免冲突。
服务员怎么知道你要炸鸡还是汉堡?
系统调用号:每个操作有唯一编号(比如 SYS_read
是读文件,SYS_write
是写文件)。
如果厨房忙不过来?
内核可能会让程序等待(比如读取大文件时需要时间)。
系统调用就是用户程序“使唤”操作系统的标准化流程:
提需求 → 内核干活 → 返回结果。
全程不用碰硬件,既安全又省心!
补充知识点:
(Primitive) 是操作系统或编程中不可分割的基本操作,可以理解为“原子操作”——要么完整执行,要么完全不执行,不会被其他操作打断。它是构建复杂逻辑的“基石”。
在并发场景(如多线程、多进程)中,如果操作能被中途打断,可能导致数据不一致或系统错误。例如:
转账操作:从账户A扣款 → 向账户B加款,如果中途被打断,可能导致钱凭空消失。
原语的作用:确保这类操作像“瞬间完成”,避免中间状态暴露给其他进程。
原子性(Atomicity):执行过程不可中断。
底层性:通常由硬件或操作系统直接支持。
不可再分:无法拆解为更小的操作。
操作系统内核(Kernel) 是操作系统的核心组件,直接运行在硬件之上,负责管理系统资源(如CPU、内存、设备)并为应用程序提供基础服务。它是计算机系统的“大脑”,决定了操作系统的性能、安全性和稳定性。
大内核(宏内核)与微内核的区别
大内核和微内核是操作系统设计的两种核心架构,区别主要在于功能集成度、模块通信方式和设计哲学。以下是通俗易懂的对比:
大内核(如Linux):
“全家桶”模式:所有核心功能(文件系统、驱动、网络协议等)都塞进内核。
直接通信:模块间通过函数调用直接交互,效率高。
微内核(如QNX):
“极简核心”模式:内核仅保留基础功能(进程调度、内存管理),其他功能作为用户态服务。
消息传递:模块间通过消息通信,隔离性强但开销大。
对比维度 | 大内核 | 微内核 |
---|---|---|
内核大小 | 庞大,包含所有核心功能 | 极小,仅基础功能 |
性能 | 高(直接调用,无上下文切换) | 较低(消息传递需切换用户/内核态) |
稳定性 | 低(一个模块崩溃可能导致全崩) | 高(服务崩溃不影响内核) |
扩展性 | 差(需修改内核代码) | 优(动态加载用户态服务) |
适用场景 | 通用系统(如服务器、桌面) | 高可靠系统(如航天、车载) |
代表系统 | Linux、传统UNIX | QNX、鸿蒙LiteOS、Minix |
大内核:
像一家大型工厂,所有车间(文件系统、驱动)都在同一厂房内。
优点:车间协作快,生产效率高。
缺点:火灾(Bug)可能蔓延全厂。
微内核:
像总部+外包团队,总部只做核心决策(调度、通信),其他工作外包给独立团队。
优点:外包团队着火不影响总部。
缺点:沟通(消息传递)效率低。
选大内核:
需要极致性能的场景(如高性能计算、游戏服务器)。
开发者愿意为效率牺牲部分稳定性。
选微内核:
要求高可靠性的场景(如汽车控制系统、航天器)。
系统需频繁更新服务而不重启内核。
折中设计:部分核心功能在内核态(如驱动),部分在用户态(如文件系统)。
特点:平衡性能与安全性,但复杂度较高。
大内核:功能多、跑得快,但一崩全崩。
微内核:功能少、更安全,但沟通费劲,状态转换太麻烦。
实际应用:你的手机(如Android基于Linux大内核)和汽车中控(如QNX微内核)可能同时用到了这两种设计
内层分多层,每层单向调用更低一层提供的接口
优点:
(1).便于调试和验证,自低向上逐层调试验证
(2).易扩充和易维护,各层之间调用接口清晰固定
缺点:
(1).只能调用相邻底层,难以合理定义各层的边界
(2).效率低,不可跨层调用,系统调用执行时间延长
将内核划分为多个模块,各模块之间相互协作。
内核=主模块+可加载内核模块
主模块:只负责核心功能,如进程调度、内存管理
可加载内核模块:可以动态加载新模块到内核,而无需重新编译整个内核
优点:
缺点:
外核模式(Exokernel) 是一种操作系统内核设计架构,其核心思想是最小化内核功能,仅负责硬件资源的安全隔离与保护,而将资源管理的具体策略交给用户态应用程序。它是为了突破传统操作系统内核的抽象限制,允许应用程序更直接、灵活地控制硬件资源而提出的设计理念。
将操作系统内核比作**“房东”,应用程序是“租户”**:
传统内核(如Linux):房东不仅分配房间,还规定租户如何使用水电、家具(资源抽象为文件、进程等)。
外核模式:房东只保证房间之间的隔离和安全(防止租户互相干扰),水电和家具的使用方式完全由租户自己决定。
windows操作系统完整的开机初始化程序在”根目录/windows/Boot“下