操作系统运行机制太抽象,还在死记硬背?5分钟我帮你全串起来了
一、先别急,我们先搭个骨架
很多同学学操作系统,觉得它“太抽象”、“东西太多”、“东一榔头西一棒子”,根本原因是没有把知识点串成一条线。
今天这篇文章,我不讲零散的考点,只做一件事:把“操作系统运行机制”的完整骨架画给你看。
从你写代码,到代码在CPU上执行,中间经历的每一个关键环节,全部串起来。看完这篇,后面你遇到的任何零散知识点(内核态、用户态、特权指令、PSW、中断……),都能在这个骨架上找到自己的位置。
二、第一步:你写代码,翻译官上场
你用高级语言(比如C语言)写了一段代码:
c
int a = 1 + 1;printf("%d", a);
机器看不懂这些英文字母,它只认识机器语言——也就是一串串的0101二进制指令。
这就像你只会说中文,而CPU只会听外国语。怎么办?找个翻译。
编译器就是那个翻译官。它把你的C语言代码,翻译成CPU能看懂的机器指令(二进制文件,比如.exe)。
翻译完之后,程序就准备好了,等待CPU来执行它。
三、第二步:CPU开始执行,但“身份”很重要
你双击运行程序,CPU开始一条一条地取指令、执行指令。
但是CPU在执行的时候,并不是“无脑”地照单全收。它会每执行一条指令前,先检查一条指令的身份。
指令分两种
非特权指令:比如两数相加、数据搬家。这些指令只影响程序自己,不影响别人。随便执行,安全。
特权指令:比如停机指令、修改内存页表、直接读写硬盘扇区。这些指令能决定计算机的“生死”,一旦乱用,整个系统都会遭殃。
为什么应用程序绝对不能执行特权指令?三个场景让你秒懂:
破坏公平:假如你正在跟女朋友视频聊天(程序A),隔壁程序(程序B)执行了一条特权指令:“把CPU全部时间给我,切断其他程序!”——你的视频立马卡死,而且你毫无办法。
摧毁隐私:内存里同时住着微信、浏览器、操作系统内核。如果应用程序能执行特权指令“修改内存页表”,它就能把自己的“房间墙”打穿,直接去读你的微信聊天记录、去改你的浏览器密码。
系统崩溃:如果恶意程序改了操作系统内核的内存数据,电脑直接蓝屏崩溃。
所以,不让应用程序执行特权指令,不是为了欺负程序,而是为了保护你的隐私(不被偷窥)、保证你的体验(不卡顿)、保住你的电脑(不蓝屏)。
那CPU凭什么区分这两种指令?
答案是:设计和生产时就规定好了!
CPU的译码器硬件电路里,天然就划分了“哪些二进制操作码是特权指令,哪些是非特权指令”。这是写死在芯片里的“出厂设定”,不是软件能改的。
四、第三步:CPU怎么知道当前“有没有资格”执行特权指令?
既然指令分等级,那CPU在执行的时候,总得知道“当前执行者是谁”吧?
就像机场安检,安检员不仅要看你拿的是什么票(指令类型),还要看你现在到底走的是普通通道还是VIP通道(当前状态)。
CPU内部有一个极其重要的寄存器,叫程序状态字寄存器(PSW)。
这个寄存器里有一个二进制位,专门记录当前CPU处于什么状态:
1(内核态) :管理员模式,什么指令都能执行。
0(用户态) :游客模式,只能执行非特权指令。
每次CPU译码一条指令时,都会同步做一件事:查PSW的状态位。
如果当前是用户态(0) + 当前指令是非特权指令 → 放行。
如果当前是用户态(0) + 当前指令是特权指令 → 拒绝!触发中断!
注意:这个检查是硬件电路并发完成的,不需要软件参与,速度极快,几乎不消耗额外时间。
五、第四步:万一应用程序里偷偷藏了特权指令怎么办?
这是整个机制里最精彩、也最关键的部分。
假设黑客在应用程序里偷偷插入了一条特权指令。当CPU执行到这条指令时:
译码阶段:CPU发现“这是一条特权指令”。
查PSW:CPU发现“当前状态是用户态(0)”。
(拓展:CPU 中有一个寄存器叫程序状态字寄存器(PSW),其中有个二进制位,1表示“内核态”,0表示“用户态”)
硬件判定:两者不匹配!用户态没资格执行特权指令!
硬件自动“变态”:CPU硬件电路直接触发中断信号,同时强制把PSW寄存器里的状态位从“用户态(0)”拨到“内核态(1)”。这个过程叫“变态”,是纯硬件完成的,不需要任何软件参与。
操作系统接手:CPU根据中断号,跳转到内存中对应的内核程序去执行。
内核处理:内核查了一下“问题手册”,发现这个程序企图非法执行特权指令,直接判定违规,果断杀掉这个进程(你看到的“程序崩溃”就是这一步)。
切回用户态:处理完毕后,内核执行一条特权指令(此时它处于内核态,有资格),把PSW的状态位从“1(内核态)”改回“0(用户态)”,把控制权交还给其他应用程序。
这里也再次印证了:内核到底是什么?
内核就是由很多很多内核程序组成的,是操作系统最重要的部分。它就像一本厚厚的“突发事件应对手册”如:
问题1(非法指令) → 对策:杀掉进程
问题2(缺页中断) → 对策:从硬盘调数据到内存
问题3(系统调用) → 对策:帮应用程序执行特权操作
..................
CPU遇到什么问题,就来手册里查对应的解决规则,照章办事。
六、补充:进入内核态,不只“干坏事”这一种情况
刚才讲的是“非法插入特权指令”,这是被动的异常。
但程序进入内核态,还有一种主动的、合法的情况。
比如你想打印一行字到屏幕上,这属于操作硬件的特权操作。应用程序会主动执行一条“陷阱指令”(比如Linux里的int 0x80),主动触发中断,向内核请求帮忙。
这相当于:你(应用程序)主动向皇帝(内核)递了一份奏折(系统调用),申请盖个章(执行特权操作)。内核审核通过后,帮你把事情办了,办完再归还控制权。
所以进入内核态分两种:
主动的:系统调用(请求服务,合法)
被动的:异常/中断(非法操作或外部事件,被迫)
不管哪种,只有中断(主动或被动)才能触发“变态”,让CPU从用户态切换到内核态。
七、最终闭环:总结
【用户态】应用程序逐条执行指令
↓ (遇到系统调用 / 发生异常 / 外部中断)
【硬件自动变态】PSW状态位:0(用户态)→ 1(内核态)
↓ (CPU跳转到内核代码区)
【内核态】执行内核程序(查手册、定规矩、处理问题)
↓ (处理完毕,执行修改PSW的特权指令)
【硬件改回用户态】PSW状态位:1(内核态)→ 0(用户态)
↓ (CPU回到应用程序下一条指令)
【用户态】继续执行……(循环往复,直到程序结束)
这就是操作系统运行机制的完整骨架。
后面的文章,我会在这个骨架上,把每一个关节拆开细讲
关注我,一篇一篇拆给你看。下次面试官问你“操作系统运行机制”,你直接把这幅骨架画给他看。
你学会了吗?
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)