作者:南塘所有的经筒 | 来源:互联网 | 2023-05-31 13:47
文章目录什么是OS?进程oscpu系统调用之间的关系运行机制和体系结构特权指令和非特权指令?用户态和核心态为什么划分用户态和核心态?核心态和用户态的区别?什么是用户态和核心态之间的
文章目录 什么是OS? 运行机制和体系结构 特权指令和非特权指令? 用户态和核心态 为什么划分用户态和核心态? 核心态和用户态的区别 ? 什么是用户态和核心态之间的切换? 用户态切换到内核态的3种方式 内核态切换到用户态的方式 其他 操作系统内核 大内核和微内核
什么是OS?
操作系统是整个计算机系统的控制者(操作系统能访问整个内存地址空间,能够决定CPU分配给哪个进程,可以控制各种设备,比如磁盘,网卡,键盘,鼠标,等等)
进程 os cpu 系统调用之间的关系 系统调用的设计思想基本上就是按照警察与囚犯的模式来实现的。
进程
可以通过系统调用
向操作系统
发起请求,希望操作系统替自己去完成某项操作,但是操作系统怎么完成取决于自己而且不受进程控制,进程也不知道操作系统是如何完成请求的,这是现代操作系统实现进程、多任务、虚拟内存等重要功能一个基本前提。
运行机制和体系结构
特权指令和非特权指令? 什么是指令? 指令就是CPU能识别并执行的最基本的命令
分为: 1、特权指令: 只能由操作系统使用、用户程序不能使用的指令 包括: ①改变机器状态的指令; ②修改特殊寄存器的指令; ③涉及外部设备的输入/输出指令。
2、非特权指令: 用户程序可以使用的指令。 包括: 控制转移 算数运算 取数指令 访管指令(使用户程序从用户态陷入内核态)
特权级别: R0、R1、R2和R3,R0相当于内核态,R3相当于用户态;
用户态和核心态 为什么划分用户态和核心态? 由于操作系统需要限制不同的程序之间的访问能力。
为什么要限制? 因为操作系统是整个计算机系统的控制者(操作系统能访问整个内存地址空间,能够决定CPU分配给哪个进程,可以控制各种设备,比如磁盘,网卡,键盘,鼠标,等等) 如果某个进程能控制操作系统的话,那么这个进程就绕过了操作系统进而控制了整个计算机系统,这显然是不合理的(比如该进程一直使用CPU而不分配给其它进程)。
因此操作系统必须通过某种方法来限制进程。
如何限制? 我们知道操作系统其实也是一个大的C程序,本质上和我们写的C程序没有任何区别。 操作系统和用户程序都需要被编译成机器指令才能被CPU执行。因此
当CPU执行的是来自操作系统的机器指令
时,计算机表现出来的就是操作系统正在运行
(比如操作系统收发网络数据)。 当CPU执行的是来自用户程序的机器指令
时,计算机表现出来的就是用户程序正在运行
(比如浏览器正在加载页面)。 从这里我们可以看出,单纯的依靠软件是没有办法来区分操作系统和用户程序的,因为这二者本质上都是机器指令,因此要想限制进程必须还要依靠硬件的帮助 。
CPU来帮忙
CPU在执行机器指令时的工作状态:
当CPU工作在用户态模式时会受到限制,不能执行所有的机器指令(比如I/O操作类指令,这类指令被称为特权指令),只能访问部分的内存空间, 但当切换到内核工作模式下CPU满血复活,在该工作状态下,CPU可以执行所有指令类型包括特权指令,可以访问所有的内存地址空间,在这种工作状态下CPU可以解锁全部功能。CPU中有专门的寄存器用来记录当前CPU的工作状态。 操作系统正是利用了CPU区分工作模式的功能来达到限制进程的目的
所以最终OS分为用户态和内核态:
用户态:用户进程操控计算机 当CPU在执行用户程序的指令时,操作系统把CPU的工作模式设置为用户模式,在这种模式下,用户程序不能直接控制外部设备,不能直接发起I/O请求,不能访问超过自己范围的内存空间,禁止使用特权指令
,不能直接取用系统资源与改变机器状态。
系统调用进入内核态 当用户程序需要向操作系统发起请求时会进行系统调用
。 CPU会跳转到提前定义好的内存地址中,这里保存的是操作系统的代码,专门用来处理trap指令。执行trap指令后,CPU开始切换到内核模式执行操作系统指令。
内核态:操作系统开始接管计算机 操作系统接管计算机,当操作系统接管计算机后,操作系统是信任自己的,因此操作系统可以控制所有计算机中的硬件(CPU、内存、磁盘、网卡等外设),可以访问整个内存的地址空间,可以决定是否继续让某个进程使用CPU(控制进程),可以向外部设备发起I/O命令。通过检查trap指令中请求类型,操作系统首先判断进程请求是否合法,如果请求合法,那么操作系统就替用户进程完成请求,把执行结果返回给进程,之后CPU再次切换回用户模式,在得到操作系统的返回结果后用户进程继续运行。
核心态和用户态的区别 ? 什么是用户态和核心态之间的切换? 当用户程序执行时,若需要请求操作系统服务,通过系统调用由用户态转为核态,由操作系统得到控制权,在核态下执行其相应的命令,服务完毕后,返回到用户态,让用户继续执行。
用户态切换到内核态的3种方式 a. 系统调用 这是用户态进程主动要求
切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的实现原理是中断。 b. 异常 当CPU在执行 运行在用户态下的程序时,发生了某些事先不可知的异常,就会转到内核态,比如缺页异常。 c. 外围设备的中断 当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作。
这3种方式中系统调用是用户进程主动发起的,异常和外围设备中断则是被动的。
从触发方式上看,可以认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一致的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本上也是一致的,
内核态切换到用户态的方式 执行一条特权指令,设置PSW的系统状态位
为用户态
。
其他 核态和管态 有的系统将核心态
进一步分为核态和管态
,这时,管态的权限有所变化,管态只允许使用一些在用户态下所不能使用的资源,但不能使用修改机器的状态指令。而核态(kernel mode)
就具有上述管态
所具有的所有权限。无核态的系统,管态执行核态的全部功能。管态比核态权限要低,用户态的权限更低。
程序状态寄存器PSW 为了区分处理机的工作状态,需要硬件的支持。在计算机程序状态寄存器
中需设置一个系统状态位(模式位)
。若有了系统状态位,就可以区分当前正在执行的是系统程序还是用户程序。若用户程序执行时,超出了它的权限,如要访问操作系统核心数据或企图执行一个特权指令,都将从用户态转为管态,由操作系统得到CPU控制权,处理这一非法操作。这样可以有效地保护操作系统不受破坏。
操作系统内核
大内核和微内核