热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

OS运行机制和体系结构

文章目录什么是OS?进程oscpu系统调用之间的关系运行机制和体系结构特权指令和非特权指令?用户态和核心态为什么划分用户态和核心态?核心态和用户态的区别?什么是用户态和核心态之间的




文章目录


  • 什么是OS?
    • 进程 os cpu 系统调用之间的关系

  • 运行机制和体系结构
    • 特权指令和非特权指令?
    • 用户态和核心态
      • 为什么划分用户态和核心态?
      • 核心态和用户态的区别 ?
      • 什么是用户态和核心态之间的切换?
      • 用户态切换到内核态的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再次切换回用户模式,在得到操作系统的返回结果后用户进程继续运行。


核心态和用户态的区别 ?


  • 执行权限
    用户态由用户程序操控计算机,用户程序不能直接控制外部设备,不能直接发起I/O请求,不能访问超过自己范围的内存空间,禁止使用特权指令,不能直接取用系统资源与改变机器状态。
    核心态由OS操控计算机,可以访问所有的内存空间,执行所有的指令等等。

  • 处理机是否可被抢占
    处于用户态时,其占有的处理机是可被抢占的
    处于核心态时,所占有的处理机是不允许被抢占的


什么是用户态和核心态之间的切换?

当用户程序执行时,若需要请求操作系统服务,通过系统调用由用户态转为核态,由操作系统得到控制权,在核态下执行其相应的命令,服务完毕后,返回到用户态,让用户继续执行。


用户态切换到内核态的3种方式

a. 系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的实现原理是中断。
b. 异常
当CPU在执行 运行在用户态下的程序时,发生了某些事先不可知的异常,就会转到内核态,比如缺页异常。
c. 外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作。

这3种方式中系统调用是用户进程主动发起的,异常和外围设备中断则是被动的。

从触发方式上看,可以认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一致的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本上也是一致的,


内核态切换到用户态的方式

执行一条特权指令,设置PSW的系统状态位用户态


其他

核态和管态
有的系统将核心态进一步分为核态和管态,这时,管态的权限有所变化,管态只允许使用一些在用户态下所不能使用的资源,但不能使用修改机器的状态指令。而核态(kernel mode)就具有上述管态所具有的所有权限。无核态的系统,管态执行核态的全部功能。管态比核态权限要低,用户态的权限更低。

程序状态寄存器PSW
为了区分处理机的工作状态,需要硬件的支持。在计算机程序状态寄存器中需设置一个系统状态位(模式位)。若有了系统状态位,就可以区分当前正在执行的是系统程序还是用户程序。若用户程序执行时,超出了它的权限,如要访问操作系统核心数据或企图执行一个特权指令,都将从用户态转为管态,由操作系统得到CPU控制权,处理这一非法操作。这样可以有效地保护操作系统不受破坏。


操作系统内核

在这里插入图片描述

在这里插入图片描述


大内核和微内核

在这里插入图片描述



推荐阅读
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
author-avatar
南塘所有的经筒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有