(1)操作系统

一.内核态vs用户态:

(1)cpu有两种状态:”内核态“和”用户态“

(1)处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令

(2)处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令

cpu怎么判断出指令的类型的?

CPU 判断指令类型的过程主要依赖于 指令解码(Instruction Decoding),其核心是通过解析指令的二进制编码来识别操作类型和操作数。例如:

  • 操作码 ADD 可能对应二进制 000001JUMP 对应 010101

cpu能判断出指令的类型,但是如何区分此时运行的程序是内核程序还是用户程序?

拓展:cpu中有一个寄存器叫做程序状态寄存器(psw),其中有个二进制位,1表示内核态,0表示用户态。

别名:内核态=核心态=管态;用户态=目态

(2)用户态和内核态的切换

  1. 刚开机时,cpu为”内核态“,操作系统内核程序先上cpu运行
  2. 开机完成后,用户可以启动某个应用程序
  3. 操作系统内核程序在合适的时候让出cpu,让该应用程序上CPU运行----操作系统内核在让出CPU之前,会用一条特权指令把psw的标志位设置为“用户态’
  4. 应用程序运行在"用户态"
  5. 此时,如果一个猥琐黑客在应用程序中植入了一条特权指令,企图破坏系统
  6. CPU接下来要执行的这条指令是特权指令,但是自己又处于”用户态“
  7. 这个非法事件会引发一个中断----CPU检测到中断时,会立即变为”核心态‘,并且停止运行当前的应用程序,转而运行处理中断信号的内核程序。
  8. 中断会使操作系统再一次夺回CPU的控制权。
  9. 操作系统会对引起的中断的事件进行处理,处理完了把CPU使用权交给别的应用程序。

用户态与内核态的切换通过硬件中断、系统调用或异常触发,依赖 CPU 的上下文保存/恢复机制和操作系统的中断处理逻辑。这一过程确保了系统资源的安全访问和高效管理,是现代操作系统的核心基础之一。

内核态----用户态:一条psw的特权指令

用户态---内核态:由中断引起,硬件自动完成

二、中断和异常:

1.中断的分类

1. 硬件中断(外部中断)

  • 触发源:由硬件设备发起(如键盘、磁盘、网卡)。

  • 类型

    • 可屏蔽中断(Maskable Interrupt):可通过CPU标志位(如x86的IF位)暂时屏蔽(如网络数据包处理)。

    • 不可屏蔽中断(NMI):必须立即处理(如硬件故障、内存校验错误)。

2. 软件中断(内部中断)

  • 触发源:由程序执行特定指令或发生异常引发。

    • 异常(Exception):CPU执行指令时的错误或特殊状态(如缺页异常、除零错误)。

    • 系统调用(System Call):用户程序主动请求内核服务(如文件读写)。

    • -----执行”陷入指令“,陷入:程序故意引发的,特殊的指令,程序主动把CPU的特权还给操作系统

    • 陷入指令=trap指令=访管指令

3、中断与陷阱(Trap)的区别

  • 特性 中断(Interrupt) 陷阱(Trap)
    触发时机 异步(随时发生) 同步(由程序执行触发)
    典型场景 硬件事件(如时钟中断) 系统调用、断点调试
    返回行为 通常返回到中断后的下一条指令 可能修改程序流程(如异常处理)

 三、系统调用:

1.什么是系统调用:

系统调用(System Call) 是操作系统内核提供给用户程序(应用程序)的接口,允许程序通过内核访问计算机的底层硬件和资源(如文件、网络、进程、内存等)。它是用户程序与操作系统之间的桥梁。


为什么需要系统调用?

操作系统需要管理和保护硬件资源,避免用户程序直接操作硬件可能导致的冲突或安全问题。例如:

  • 程序无法直接读写磁盘,必须通过系统调用请求内核代为操作。

  • 程序无法直接创建新进程,需通过系统调用委托内核完成。

  • 程序如果并发执行,需要系统调用解决冲突问题,并且因为资源是有限的,所以需要共享,为了解决冲突问题,需要系统调用。

  • (1)操作系统_第1张图片

 2.系统调用的过程:

易错:

(1)传参指令 -->陷入指令”用户态“(会内引发中断)->”内核态“ 其他指令

(2)发出系统调用请求是在用户态,而对系统调用的相应处理核心态下进行

想象场景

  • :用户程序(比如一个App)。

  • 服务员:系统调用接口。

  • 厨房:操作系统内核(唯一能直接操作硬件的地方)。

你想点一份炸鸡(比如想读取文件),但你不能直接进厨房炸鸡,必须通过服务员下单。


系统调用的具体步骤

1. 你下单:发起系统调用请求
  • 用户程序:调用一个函数(比如 read() 读取文件)。

  • 就像:你在手机App里点击“下单炸鸡”。


2. 服务员接单:切换到内核态
  • CPU切换模式:从用户态(普通权限)切换到内核态(最高权限)。

  • 就像:服务员收到订单后,拿着你的需求进入厨房(只有厨房有设备和权限做炸鸡)。


3. 厨房处理:内核执行操作
  • 内核:根据你的请求类型(比如系统调用号 SYS_read),操作硬件(比如从硬盘读取文件)。

  • 就像:厨房根据订单开始炸鸡,用油锅(硬件)加工食材。


4. 服务员返回:切换回用户态
  • 内核完成操作:把结果(比如文件内容)返回给用户程序。

  • CPU切换回用户态:退出内核态,恢复用户程序的执行。

  • 就像:服务员把炸鸡打包好,从厨房出来交给你,然后继续处理其他顾客需求。


5. 你收到结果:用户程序继续运行
  • 用户程序:拿到数据后继续执行后续代码。

  • 就像:你拿到炸鸡开始吃,继续玩手机。


关键点

  1. 为什么不能直接进厨房?

    • 安全!如果每个顾客都能随便用油锅,厨房会着火(系统崩溃)。

    • 统一管理:服务员(内核)确保订单按顺序处理,避免冲突。

  2. 服务员怎么知道你要炸鸡还是汉堡?

    • 系统调用号:每个操作有唯一编号(比如 SYS_read 是读文件,SYS_write 是写文件)。

    • 如果厨房忙不过来?

      • 内核可能会让程序等待(比如读取大文件时需要时间)。

总结:

系统调用就是用户程序“使唤”操作系统的标准化流程:
提需求 → 内核干活 → 返回结果
全程不用碰硬件,既安全又省心!

四:操作系统的体系结构:

补充知识点:

(1)原语:

(Primitive) 是操作系统或编程中不可分割的基本操作,可以理解为“原子操作”——要么完整执行,要么完全不执行,不会被其他操作打断。它是构建复杂逻辑的“基石”。


为什么需要原语?

在并发场景(如多线程、多进程)中,如果操作能被中途打断,可能导致数据不一致或系统错误。例如:

  • 转账操作:从账户A扣款 → 向账户B加款,如果中途被打断,可能导致钱凭空消失。

  • 原语的作用:确保这类操作像“瞬间完成”,避免中间状态暴露给其他进程。


原语的典型特征

  1. 原子性(Atomicity):执行过程不可中断。

  2. 底层性:通常由硬件或操作系统直接支持。

  3. 不可再分:无法拆解为更小的操作。

(2)内核:

操作系统内核(Kernel) 是操作系统的核心组件,直接运行在硬件之上,负责管理系统资源(如CPU、内存、设备)并为应用程序提供基础服务。它是计算机系统的“大脑”,决定了操作系统的性能、安全性和稳定性。

大内核(宏内核)与微内核的区别
大内核和微内核是操作系统设计的两种核心架构,区别主要在于功能集成度、模块通信方式设计哲学。以下是通俗易懂的对比:


1. 核心思想

  • 大内核(如Linux)

    • “全家桶”模式:所有核心功能(文件系统、驱动、网络协议等)都塞进内核。

    • 直接通信:模块间通过函数调用直接交互,效率高。

  • 微内核(如QNX)

    • “极简核心”模式:内核仅保留基础功能(进程调度、内存管理),其他功能作为用户态服务。

    • 消息传递:模块间通过消息通信,隔离性强但开销大。


2. 直观对比表

对比维度 大内核 微内核
内核大小 庞大,包含所有核心功能 极小,仅基础功能
性能 高(直接调用,无上下文切换) 较低(消息传递需切换用户/内核态)
稳定性 低(一个模块崩溃可能导致全崩) 高(服务崩溃不影响内核)
扩展性 差(需修改内核代码) 优(动态加载用户态服务)
适用场景 通用系统(如服务器、桌面) 高可靠系统(如航天、车载)
代表系统 Linux、传统UNIX QNX、鸿蒙LiteOS、Minix

3. 通俗比喻

  • 大内核
    像一家大型工厂,所有车间(文件系统、驱动)都在同一厂房内。

    • 优点:车间协作快,生产效率高。

    • 缺点:火灾(Bug)可能蔓延全厂。

  • 微内核
    总部+外包团队,总部只做核心决策(调度、通信),其他工作外包给独立团队。

    • 优点:外包团队着火不影响总部。

    • 缺点:沟通(消息传递)效率低。


4. 典型场景

  • 选大内核

    • 需要极致性能的场景(如高性能计算、游戏服务器)。

    • 开发者愿意为效率牺牲部分稳定性。

  • 选微内核

    • 要求高可靠性的场景(如汽车控制系统、航天器)。

    • 系统需频繁更新服务而不重启内核。


5. 混合内核(如Windows、macOS)

  • 折中设计:部分核心功能在内核态(如驱动),部分在用户态(如文件系统)。

  • 特点:平衡性能与安全性,但复杂度较高。


6. 一句话总结

  • 大内核:功能多、跑得快,但一崩全崩。

  • 微内核:功能少、更安全,但沟通费劲,状态转换太麻烦。

实际应用:你的手机(如Android基于Linux大内核)和汽车中控(如QNX微内核)可能同时用到了这两种设计

3.分层结构:

内层分多层,每层单向调用更低一层提供的接口

优点:

(1).便于调试和验证,自低向上逐层调试验证

(2).易扩充和易维护,各层之间调用接口清晰固定

缺点:

(1).只能调用相邻底层,难以合理定义各层的边界

(2).效率低,不可跨层调用,系统调用执行时间延长


4.模块化:

将内核划分为多个模块,各模块之间相互协作。

内核=主模块+可加载内核模块

主模块:只负责核心功能,如进程调度、内存管理

可加载内核模块:可以动态加载新模块到内核,而无需重新编译整个内核

优点:

  1. 模块之间逻辑权限易于维护,确定模块间接口后即可以多模块同时开发。
  2. 支持动态加载新的模块
  3. 任何模块都可以直接调用其他模块,无需采用信息传递进行通信,效率高。

缺点:

  1. 模块间的定义未必合理、实用
  2. 模块间相互依赖,更难调试和验证

5.外核

外核模式(Exokernel) 是一种操作系统内核设计架构,其核心思想是最小化内核功能,仅负责硬件资源的安全隔离与保护,而将资源管理的具体策略交给用户态应用程序。它是为了突破传统操作系统内核的抽象限制,允许应用程序更直接、灵活地控制硬件资源而提出的设计理念。


通俗比喻

将操作系统内核比作**“房东”,应用程序是“租户”**:

  • 传统内核(如Linux):房东不仅分配房间,还规定租户如何使用水电、家具(资源抽象为文件、进程等)。

  • 外核模式:房东只保证房间之间的隔离和安全(防止租户互相干扰),水电和家具的使用方式完全由租户自己决定。

外核的优点

  1. 1. 极致性能:减少内核抽象层,应用程序可直接优化硬件操作(如网络包处理、数据库存储)。
  2. 2. 高度定制化:不同应用可采用最适合自身资源管理策略(例如实时系统自定义调度算法)。
  3. 3. 安全隔离:外核确保资源边界,防止应用间互相干扰。

外核的缺点

  1. 1. 开发难度大:应用程序需自行实现传统内核提供的功能(如内存管理、文件系统)。
  2. 2. 兼容性差:难以直接运行依赖标准操作系统抽象的程序(需重写或依赖LibOS)。
  3. 3. 生态匮乏:实际应用较少,工具链和社区支持不足。

六、操作系统引导:

开机引导:

windows操作系统完整的开机初始化程序在”根目录/windows/Boot“下

(1)操作系统_第2张图片

你可能感兴趣的:(Linux,linux,运维,服务器)