虽然无考研的准备,但还是看起了王道计算机考研的课程,那听这个课的目的主要是为了应付计算机组成原理、计算机操作系统原理、计算机网络这三门的课期末考试【一个学期开计算机四大件里的三门课,也是有了】,所以都是挑着看的,笔记内容不全也不会深入。
本来想等听完课再发笔记,但想了想确实平时看笔记确实不方便,所以这篇笔记就是会到期末之前一直更新中的笔记,以方便我平时的查看【这也算是搭建博客的好处吧,可以无视设备平台限制随时看笔记】。
计算机组成原理
1.2.1 + 1.2.2 计算机硬件的基本组成
计算机硬件的基本组成:
- 早期冯诺依曼机的结构
- 现代计算机的结构
世界上第一台计算机 ENIAC,由于早期的计算机是手动接线来控制计算的,也就意味着对计算机每做一次操作就需要人工手动进行一次操作,效率很低。所以冯诺依曼提出“存储程序”的概念。
“存储程序” 的概念是指将以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。
于是就有了 EDVAC,世界上第一台采用冯诺依曼结构的计算机。
上图为早期冯诺依曼机的结构,数据通过输入设备进入,然后通过运算器的运算存放到存储器中,控制器可以指挥存储器中的程序数据运行,输出设备将运算的结果输出。
在计算机系统中,软件和硬件在逻辑上是等效的。
Eg:对于乘法运算,可以设计一个专门的硬件电路实现乘法运算。也可以用软件的方式,执行多次加法运算来实现。
冯·诺依曼计算机的特点:
- 计算机由五大部件组成(计算器、控制器、存储器、输入设备、输出设备)
- 指令和数据以同等地位存于存储器,可按地址寻访
- 指令和数据用二进制表示
- 指令由操作码和地址码组成
- 存储程序
- 以运算器为中心(输入/输出设备与存储器之间的数据传送通过运算器完成)
冯诺依曼机以运算器为中心,运算器是处理数据的核心部件,但是冯诺依曼结构中所有数据的中转还是需要运算器来完成,会导致数据计算的效率降低。
因此现代计算机以存储器为中心,也就是说输入的数据是直接放到存储器中的,然后运算器可以存储和读取存储器中的数据,存储器也可以直接将数据输出给输出设备,这样很多中转操作无需通过运算器,自然也就提高了效率。
以上便是现代计算机的结构。将运算器(算数/逻辑运算)和控制器(发出指令)整合便是 CPU。
所以:CPU = 运算器 + 控制器
于是将两个部件合并,下图为更简洁的表示:
需要注意的是,存储器又可以分为主存和辅存,主存就是内存(内存条),辅存就是外存(硬盘)。机组中的主机只包含 CPU 和主存,而辅存属于 I/O(输入/输出)设备。主机和 I/O 设备组成了计算机的硬件。
总结如下:
1.2.2 各个硬件的工作原理
本节简单介绍了计算机主机(运算器、控制器、主存)的各个设备。
主存储器的基本组成
主存储器由:存储体、MAR(存储地址寄存器) 和 MDR(存储数据寄存器)组成。
CPU 在读取主存储器中的数据时,会告诉 MAR 需要数据的地址,然后 MAR 通过地址在存储体中找对应的数据,然后将找到的数据给 MDR,最后 CPU 会读取 MDR 中给的数据。
类似的,CPU 将数据存放到主存储器中时,会告诉 MAR 数据需要存放的地址,并且给 MDR 具体的数据,然后通过 MAR 和 MDR 将数据存放到存储体当中。
存储体的组成如下:
存储单元:每个存储单元存放一串二进制代码
存储字(word):存储单元中二进制代码的组合
存储字长:存储单元中二进制代码的位数
存储元:即存储二进制的电子原件,每个存储元可存 1bit
重点:
- MAR 位数反映存储单元的个数
- MDR 位数 = 存储字长
例,加入某个计算机的MAR 和 MDR为:
- MAR = 4 位 -> 总共有 24 个存储单元
- MDR = 16 位 – > 每个存储单元可存放 16bit,此时一个字(word) = 16bit
这里容易混淆的是:上述的字(word)和字节(Byte)不是同一个东西。字节(Byte)是一个常量,1 个字节(Byte) = 8bit,也就是 1B = 1 个字节, 1b = 1 个 bit。而字(word)指的是存储字,根据每个计算机不同的设计结构,也就是 MDR 的位数而改变。
运算器的基本组成
运算器由 ACC、MQ、X 和 ALU 组成,其中的核心是 ALU。
ACC、MQ 和 X 本质上都是存取数据的寄存器,而只有 ALU 是做算术的算术逻辑单元。
控制器的基本组成
控制器由 CU、IR 和 PC 组成,其中的核心是 CU。
控制器完成一条指令的步骤为:
- 通过 PC 告诉存放需要执行指令的地址。
- 将当前的指令存放到 IR 中完成分析指令。
- 通过 CU 完成指令的执行。
前两个步骤取指令和分析指令可以统称为取指。
计算机的工作过程
int a = 2, b = 3, c = 1, y = 0;
void main(){
y = a * b + c;
}
本小节总结
注:传统计算机中,MAR 和 MDR 属于主存,但是现代计算机中 MAR 和 MDR 通常会被集成在 CPU 中。
1.2.3 计算机软件
系统软件和应用软件
计算机软件可以分为:系统软件和应用软件。
应用软件是为了解决某个应用领域的问题而编制的程序。(面向用户)
系统软件负责管理硬件资源,并向上层应用程序提供基础服务。(面向硬件)
三种级别的语言
计算机中三种级别的语言从距离硬件距离近到远分别是:机器语言(二进制代码)、汇编语言(助记符)、高级语言(C/C++、Java、Python)
高级语言通过编译程序(编辑器),将高级语言翻译成汇编语言,然后汇编语言通过汇编程序(汇编器)将汇编语言翻译成机器语言执行。
高级语言 -> 汇编语言 -> 机器语言
有些高级语言会通过编译程序(编译器)直接跳过翻译成汇编语言,直接到机器语言。
如 JavaScript、Python、Shell 等语言,会通过解释程序(解释器),直接到机器语言。
编译程序:将高级语言编写的源程序全部语句一次全部翻译成机器语言程序,而后再执行机器语言程序(只需翻译一次)
解释程序:将源程序的一条语句翻译成对应于机器语言的语句,并立即执行。紧接着再翻译下一句(每次执行都要翻译)
因此解释程序的执行效率通常比较低下。
软件和硬件的逻辑功能等价性
软件和硬件的逻辑功能等价性:同一个功能,既可以用硬件实现(性能高、成本高),也可以用软件实现(性能低、成本低)
指令集体系结构(ISA):软件和硬件之间的界面。设计计算机系统的ISA,就是要定义一台计算机可以支持哪些指令,以及每条指令的作用是什么、每条指令的用法是什么。
总结
2.2.4.3 原码的除法运算
手算除法(二进制)
除法可以理解为:【被除数】%【除数】 = 【商】+【余数】
也可以理解为:【被除数】 = 【除数】*【商】+【余数】
之前在计算机基本组成中说到,运算器中的 ACC 在除法中用于存储被除数和余数,MQ 用于存储商,X 存储除数。
原码除法:恢复余数法
计算机中的除法方法其一:恢复余数法。
首先两个数相除,计算机会先不考虑其符号,而是取两个数的绝对值相除,最后的符号通过原数的符号做异或取得。因为其中有“减”的操作,也就是在取余操作的时候,会用除数去减被除数,因为减一个数就是加这个数的反,所以在操作之前要先对被除数的绝对值原码取补码,然后取被除数负数的补码。用[-|被除数|]补去做操作。
恢复余数法的核心思想就是:因为计算机很傻,会先默认上商 1,如果搞错了再改成上商 0。并且“恢复余数”。实现方法就是上商 0 或 1,得到余数,最后在余数末尾补 0。
上图做商计算机的操作就是:
- 在 ACC 中存入被除数,在通用寄存器中存入除数。初始的商默认为 00000(图中深色的灰是当前要确定的一位商)。
- 然后计算机先默认在当前的商位置(深灰色部分)上 1,然后将通用寄存器中的数和 ACC 中的数放入 ALU 中,进行计算。
- ALU 中会将 ACC 中的被除数减去通用寄存器中的除数。然后将结果存到 ACC 中。
- 如果此时 ACC 中的数是负数,说明此时被除数小于除数,说明不应该商 1,而是商 0。(如果此时是正数,就跳过下面三条步骤)
- 所以 MQ 中的商从 1 改成 0。
- 然后将 ACC 中的数加上通用寄存器中的除数,恢复成原来的被除数。
- 继续之前的步骤,在 ALU 中计算被除数与除数相减的结果。
- 发现此时结果为正数,也就是上商是正确的。
- 然后进行下一位的商,此时将 ACC 中的除数和 MQ 中的商左移一位。
- 重复以上步骤,直至 MQ 中存放的商位存放满,除法结束。(若最后一步上商之后余数为负数,也需要恢复余数并商 0)
最后因为移位原因,余数的数值位需要对齐,所以余数应该为:ACC 中存放的数 * 2-n(n 为移位次数,也就是商的位数)
原码除法的计算过程:
原码除法:加减交替法
前面的例子中,先默认上商 1,如果余数为负数,就加除数恢复余数,上商 0。观察这个步骤和下一步会做的事情,会发现上商 0 之后的下一个上商一定是 1。因此可以直接略过恢复余数的步骤,当余数为负的时候,可以直接将余数变成 0,然后让余数左移 1 位再加上除数。
加减交替法又可以称为不恢复余数法,其做法大致与恢复余数法相同,当遇到余数:
- 若余数为负,则可直接商 0,让余数左移 1 位再加上除数,得到下一个新的余数。
- 若余数为正,则商 1,让余数左移 1 位再减去除数,得到下应该新余数。
若最后遇到余数为负数,则也需要加除数恢复成正数。
加减交替法一共有 n + 1 次的加/减运算,每次加减确定一位商;左移 n 次(最后一次加减完不移位),最终可能还要再多一次加。
需要注意的是,因为这里讨论的是定点小数的除法,小数点的位置是确定的,所以这里被除数一定要小于除数,否则出来的结果大于 1,无法被定点数表示。因此计算机再判断这里的除法方法是否可行的时候,会判断商的第一位是否为 0,也就是一开始第一步被除数减除数时,第一次的余数一定是负数。
2.2.4.4 补码的除法运算
补码的除法类似原码除法的加减交替法。
补码除法的特点:
- 符号位参与运算
- 被除数/余数、除数采用双符号位
补码除法的规则:
- 被除数与除数:
- 被除数和除数同号,则被除数减去除数
- 被除数和除数异号,则被除数加上除数
- 余数与除数:
- 余数和除数同号,商 1,余数左移一位减去除数
- 余数和除数异号,商 0,余数左移一位加上除数
- 重复 n 次
- 商末尾恒置 1
4.1.1 + 4.1.2 + 4.1.3 指令的基本格式
指令(又称机器指令):是指计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该机的指令系统,也称为指令集。
注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。(这也就是为什么 x86 架构的软件无法在 ARM 架构中运行,因为两边的指令集不同)
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。
一条指令可以分为操作码和地址码。
- 操作码(OP):指明了“做什么”
- 地址码(A):指明了“对谁动手”
有点指令不需要地址吗(如停机操作)
一条指令可能包含 0 个、1 个、2 个、3 个、4 个地址码。根据地址码数目不同,可以将指令分为零地址指令、一地址指令、二地址指令。
根据地址码不同分类
零地址指令
(|OP|)
零地址指令的使用情况,也就是不需要指明操作数的情况:
- 不需要操作数,如空操作、停机、关中断等指令
- 堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶
一地址指令
(|OP|A1|)
一地址指令的使用:
- 只需要单操作数,如加 1、减 1、取反、求补等
- 指令含义:OP(A1) -> A1
- 完成一条指令需要 3 次访存:读取 -> 读 A1 -> 写 A1
- 需要两个操作数,但其中一个操作数隐含在某个寄存器(如隐含在累加寄存器 ACC)
- 指令含义:(ACC)OP(A1) -> ACC
- 完成一条指令需要 2 次访存:读取 -> 读 A1
注:A1 指某个主存地址,(A1)表示 A1 所指向的地址中的内容
二地址指令
(|OP|A1(目的操作数)|A2(源操作数)|)
二地址指令常用于需要两个操作数的算术运算、逻辑运算相关指令
指令含义:(A1)OP(A2) -> A1
完成一条指令需要访存 4 次,读指 -> 读 A1 -> 读 A2 -> 写 A1
默认将运算结果存到 A1 但是这样会使原本 A1 的数据丢失。
三地址指令
(|OP|A1|A2|A3(结果)|)
常用于需要两个操作数的算术运算、逻辑运算相关指令
指令含义:(A1)OP(A2) -> A3
完成一条指令需要访存 4 次,取指 -> 读 A1 -> 读 A2 -> 写 A3
将结果放到新的贮存单元,以保证原被操作数不会丢失。
四地址指令
(|OP|A1|A2|A3(结果)|A4(下址)|)
指令含义:(A1)OP(A2) -> A3,A4 = 下一条将要执行指令的地址
完成一条指令需要访存 4 次,取指 -> 读 A1 -> 读 A2 -> 写 A3
正常情况下:取指令之后 PC + 1,指向下一条指令
四地址指令:执行指令后,将 PC 的值修改为 A4 所指的地址
地址码的位数有什么影响?
n 位地址码的直接寻址范围 = 2n
若指令总长度固定不变,则地址码数量越多,寻址能力越差。
按指令长度分类
指令字长:一条指令的总长度(可能会变)
机器字长:CPU 进行一次整数运算所能处理的二进制数据的位数(通常和 ALU 直接相关)
存储字长:一个存储单元中的二进制代码位数(通常和 MDR 位数相同)
半字长指令、单字长指令、双字长指令 —— 指令长度是机器字长的多少倍。
- 半字长指令:指令字长等于机器字长一半的指令
- 单字长指令:指令字长等于机器字长的指令
- 双字长指令:指令字长等于机器字长两倍的指令
指令字长会影响取指所需时间。
如:假设机器字长 = 存储字长 = 16bit,则取一条双字长指令需要两次访存
定长指令字结构:指令系统中所有指令的长度都相等
变长指令字结构:指令系统中各种指令的长度不等
按操作码长度分类
- 定长操作码:指令系统中所有指令的操作码长度都相同
- n 位 -> 2n 条指令
- 控制器的译码电路设计简单,但灵活性较低
- 可变长操作码:指令系统中各指令的操作码长度可变
- 控制器的译码电路设计复杂,但灵活性较高
定长指令字结构 + 可变长操作码 -> 扩展操作码指令格式
按操作类型分类
总结
计算机操作系统
1.1.1 + 1.1.3 操作系统的概念、功能
操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源【操作系统是系统资源的管理者】,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境【向上层提供方便易用的服务】;它是计算机系统中最基本的软件系统【是最接近硬件的一层软件】。
操作系统的功能和目标——作为系统资源的管理者
执行一个程序前需要先将该程序放到内存中,才能被 CPU 处理。
操作系统的功能和目标——向上层提供方便易用的服务
封装思想:操作系统把一些丑陋的硬件功能封装成简单易用的服务,使用户能更方便地使用计算机,用户无需关心底层硬件的原理,只需要对操作系统发出命令即可。
操作系统的功能和目标——作为最接近硬件的层次
操作系统是对硬件机器的拓展。
没有任何软件支持的计算机称为裸机。在裸机上安装的操作系统,可以提供资源管理功能和方便用户的服务功能,将裸机改造成功能更强、使用更方便的机器。
通常把覆盖了软件的机器称为扩充机器,又称之为虚拟机。
操作系统对硬件机器的拓展:将 CPU、内存、磁盘、显示器、键盘等硬件合理地组织起来,让各种硬件能够相互协调配合,实现更多更复杂的功能。
总结
1.1.2 操作系统的特征
操作系统的特征——并发
并发:指两个或多个事件在同一个时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。【易混淆概念——并行:指两个或多个事件在同一时刻同时发生。】
操作系统的并发性指计算机系统中“同时”运行多个程序,这些程序宏观上看是同时运行着的,而微观上看是交替运行的。
操作系统就是伴随着“多道程序技术”而出现的。因此,操作系统和程序并发是一起诞生的。
注意:
单核 CPU 同一时刻只能执行一个程序,各个程序只能并发地执行。
多核 CPU 同一时刻可以同时执行多个程序,多个程序可以并行地执行。
并发性是操作系统一个最基本的特性。
操作系统的特征——共享
共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。
如果失去并发性,则系统中只有一个程序正在运行,则共线性失去存在的意义。
如果失去共享性,则两个程序不能同时访问硬盘资源,就无法实现同时发送文件,也就无法并发。
所以共享性和并发性互为存在条件。
操作系统的特征——虚拟
虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。
没有并发性,就谈不上虚拟性。
操作系统的特征——异步
异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
只有系统拥有并发性,才有可能导致异步性。
总结
1.2 操作系统的发展与分类
手工操作阶段
主要缺点:用户独占全机、人机速度矛盾导致资源利用率极低。
批处理阶段
单道批处理系统(操作系统的雏形):引入脱机输入/输出技术,并由监督程序负责控制作业的输入/输出。
- 主要优点:缓解了一定程度的人机速度矛盾,资源利用率有所提升。
- 主要缺点:内存中仅能有一道程序运行,只有该程序运行结束之后才能调入下一道程序。CPU 有大量时间是在空闲等待 I/O 完成。资源利用率依然很低。
多道批处理系统(操作系统正式诞生,用于支持多道程序并发运行):每次往内存中读入多道程序。
- 主要优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU 和其他资源更能保持“忙碌”状态,系统吞吐量增大。
- 主要缺点:用户响应时间长,没有人机交互功能(用户提交自己的作业之后就只能等待计算机处理完成,中间不能控制自己的作业执行。eg:无法调试程序/无法在程序执行的过程中输入一些参数)
分时操作系统
分时操作系统:计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互。
- 主要优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
- 主要缺点:不能优先处理一些紧急任务。操作系统对各个用户/作业都是完全公平的,循环地为每个用户/作业服务一个时间片,不区分任务和紧急性。
实时操作系统
主要优点:能够优先响应一些紧急任务,某些紧急任务不需时间片排队。在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性。
实时操作系统还分为:硬实时系统和软实时系统。
总结
1.3.1 操作系统的运行机制
一条高级语言的代码翻译过来可能会对应多条机器指令。
程序运行的过程其实就是 CPU 执行一条一条的机器指令的过程。
我们普通程序员写的程序就是“应用程序”。
微软、苹果有一帮人负责实现操作系统,他们写的是“内核程序”。
由很多内核程序组成了“操作系统内核”,或简称“内核(Kernel)”。
内核是操作系统最重要最核心的部分,也是最接近硬件的部分。
甚至可以说,一个操作系统只要有一个内核就够了(eg:Docker -> 仅需 Linux 内核就能完成功能)
操作系统的功能未必都在内核中,如图形化用户界面 GUI
两种指令
操作系统内核作为“管理者”,有时会让 CPU 执行一些“特权指令”,如:内存清零指令。这些指令影响重大,只允许“管理者”——即操作系统内核来使用。
应用程序只能使用“非特权指令”,如:加法指令、减法指令等。
在 CPU 设计和生产的时候就划分了特权指令和非特权指令,因此 CPU 执行一条指令前就能判断出其指令类型。
两种处理器状态
CPU 能判断出指令类型,但是它是怎么区分此时正在运行的是内核程序 or 应用程序?
CPU 有两种状态:“内核态” 和 “用户态”
- 处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令。
- 处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令。
拓展:CPU 中有一个寄存器叫程序状态字寄存器(PSW),其中有个二进制位,1 表示“内核态”,0 表示“用户态”。
总结
1.3.2 中断和异常
中断的作用
“中断”会使 CPU 由用户态变为内核态,使操作系统重新夺回对 CPU 的控制权。
CPU 上会运行两种程序,一种是操作系统内核程序(是整个系统的管理者),一种是应用程序。
在合适的情况下,操作系统内核会把 CPU 的使用权主动让给应用程序。
“中断”是让操作系统内核夺回 CPU 使用权的唯一途径。
如果没有“中断”机制,那么一旦应用程序上 CPU 运行,CPU 就会一直运行这个程序。这样也就失去了操作系统的并发性特征。
内核态 -> 用户态:执行一条特权指令——修改 PSW 的标志位为“用户态”,这个动作意味着操作系统将主动让出 CPU 使用权。
用户态 -> 内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回 CPU 使用权。
中断的类型
- 内中断:与当前执行的指令有关,中断信号来源于 CPU 内部。
- 外中断:与当前执行的指令无关,中断信号来源于 CPU 外部。
内中断的例子:
- 若当前执行的指令使非法的,则会引发一个中断信号。
- 试图在用户态下执行特权指令
- 执行除法指令时发现除数为 0
- 有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令——陷入指令,该指令会引发一个内部中断信号。(陷入指令不是一个特权指令。执行“陷入指令”,意味着应用程序主动地将 CPU 控制权还给操作系统内核。“系统调用”就是通过陷入指令完成的。)
外中断的例子:
- 时钟中断——由时钟部件发来的中断信号。【比如当前 CPU 正在处理应用程序 1 的任务,时钟部件每隔一个时间片(如 50ms)会给 CPU 发送一个时钟中断信号,此时 CPU 会处理时钟中断的内核程序,接着将 CPU 分配给应用程序 2 使用。】
- I/O 中断——由输入/输出设备发来的中断信号。【当输入输出任务完成时,向 CPU 发送中断信号来表示任务的完成。】
每一条指令执行结束时,CPU 都会例行检查是否有外中断信号。
中断机制的基本原理
总结
1.3.3 系统调用
操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。
“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。
系统调用与库函数的区别
高级语言中,通过库函数调用系统调用,从而请求内核的服务。
为什么系统调用是必须的?
什么功能要用到系统调用?
应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储分配、I/O 操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
系统调用的过程
传递系统调用参数 -> 执行陷入指令(用户态) -> 执行相应的内请求核程序处理系统调用(核心态) -> 返回应用程序
注意:
- 陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使 CPU 进入核心态。
- 发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行。
陷入指令 = trap 指令 = 访管指令