一. 操作系统概述
操作系统两个职责:对硬件进行管理和抽象,为应用提供服务并进行管理。
硬件角度
管理硬件:操作系统将复杂的、具备不同功能的硬件资源纳入统—的管理。
抽象硬件:操作系统负责将硬件抽象成不依赖具体硬件特性的资源,并将硬件通过易用的接口提供给上层的应用从而使应用无须关心硬件的具体细节。
应用角度
服务应用:操作系统提供了各种不同层次、不同功能的接口(如系统调用等)以满足应用的需求’还提供了不同类型的访问控制、应用间交互等胀务。(Hello World打印程序)
应用接口:
系统调用接口(printf具体调用过程)、POSIX标准接口、领域应用接口
管理应用:操作系统还负责对应用生命周期的管理,包括应用的加载、启动、切换、调度销毁等。通过对应用的管理,操作系统能够从全局角度进行资源分配。
各类硬件和应用的新变化和需求驱动各类操作系统的演变和产生。
狭义操作系统 = os内核 + Shell命令行界面
广义操作系统 = os内核 (管理和抽象硬件) + os框架 (为应用提供服务)
操作系统简史:
批处理操作系统->通用操作系统(指令集架构和具体实现分离)->分时与多任务操作系统UNIX/Linux->人机交互GUI(macOS、Windows)
二. 硬件结构
冯诺伊曼结构:CPU + 存储器Mem + IO
指令集架构 ISA 包括 指令集 和 寄存器 等。
指令集:RISC(ARM 本书以AArch64为例)、CISC(X86)
AArch64的异常级别(特权级)EL,共有四种。
EL0切换到EL1场景:
- 应用需要系统调用
- 触发异常(缺页异常)
- IO中断
切换前保存当前执行状态(PC、SP、异常原因、状态寄存器),查阅中断向量表执行对应中断处理函数、恢复现场
AArch64有31个64位通用寄存器,X29为帧指针寄存器,X30为链接指针寄存器。EL1下有两个和虚拟内存有关的页表基地址寄存器。
物理内存与cache缓存:
相比于CPU处理的速度,CPU访问内存速度是非常缓慢的,因此引入CPU缓存。
cache由若干缓存行组成,缓存行由有效位和标记地址组成。
由于软件的运行通常具有局部性(包括时间局部性和空间局部性),因此缓存能够有效提升CPU访问物理内存数据的性能;另外,操作系统和应用程序也可以根据CPU缓存的特点对代码实施优化,从而更好地利用缓存以提升性能。
内存映射输入输出:
Memory-Mapped IO是一种常见的CPU控制和访问设备的方式。
MMIO的原理:
把输人输出设备和物理内存放到同一个地址空间,为设备内部的内存和寄存器也分配相应的地址。CPU可以通过地址去读写其中的内容。类似地,MMIO为设备内部的内存和寄存器也分配了地址,CPU同样可以通过这些地址去访问和操作设备,包括读写设备中的内存数据以及寄存器。
当CPU通过MMIO的方式为一个设备分配了地址之后,CPU可以使用和访问物理内存一样的指令(ldr和str)去读写这些属于设备的地址,设备会通过总线监听CPU分配给自己的地址’然后完成相应的CPU访问请求。AArch64将MMIO作为CPU控制和访问设备的重要方式。
IO有输入时,通过中断方式通知CPU。
MMIO使得CPU可以主动地访问设备,中断使得设备能够主动地通知CPU,这两种机制是CPU与设备之间交互的重要方式。
三. 操作系统结构
操作系统的设计目标:用户目标 + 系统目标
重要设计原则:策略(policy):要做什么 + 机制(mechanism):怎么做
希望达到调整策略来适应不同需求
管理复杂系统方法:MALH方法 模块化modularity 抽象abstraction 分层layering 层级hierarchy
简要结构:将应用程序和操作系统放置于同一个地址空间,如MS-DOS
宏内核(单内核):kernel+shell 如代码超过2000w行的linux
整个系统分为内核与应用两层
内核:运行在特权级,集中控制所有计算资源
应用:运行在非特权级,受内核管理,使用内核服务
微内核:设计原则:最小化内核功能,如Mach是第一代微内核的代表
将操作系统功能移到用户态,称为"服务”(Server)
在用户模块之间,使用消息传递机制通信
Mach实现了哪些功能?
- 任务和线程管理
任务是资源分配的基本单位; 线程是执行的基本单位。
对应用提供调度接口,应用程序可实现其自定义的调度策略 - 进程间通信(IPC)︰通过端口(port)进行通信
- 内存对象管理:虚拟内存
- 系统调用重定向:允许用户态处理系统调用
支持对系统调用的功能扩展,例如,二进制翻译、跟踪、调试等 - 设备支持
通过IPC实现(通过port来连接设备)-支持同步设备和异步设备 - 用户态的多进程
类似用户态的线程库,支持wait()/signal()等原语,一个或多个用户态线程可映射到同一个内核线程。 - 分布式支持
可透明地将任务与资源映射到集群中的不同节点
外核:不提供硬件抽象,不管理资源,只管理应用。
多内核:在每个core上运行一个小内核,包括CPU、GPU等,OS整体是一个分布式系统,应用程序依然运行在OS之上。
四. 内存管理
数据从磁盘中加载到物理内存后,才能被CPU访问。
(包括操作系统的代码和数据、应用程序的代码和数据)
物理内存:内存条
如何让不同的应用程序能够既高效又安全地共同使用物理内存资源?
1.切换着用
2.共用,如Protection Key机制
以虚拟内存抽象为核心的内存管理
-CPU:支持虚拟内存功能,新增了虚拟地址空间
-操作系统︰配置并使能虚拟内存机制
-所有软件(包括OS):均使用虚拟地址,无法直接访问物理地址
CPU负责将虚拟地址翻译成物理地址。
操作系统负责设置虚拟地址与物碑地址之间的映射,操作系统仅将应用程序实际使用的虚拟
地址映射到物理地址,从而提高内存资源的利用率。
虚拟内存:分段和分页机制
分段容易产生外部碎片,段号+段内地址
分页,页号+页内偏移
加速地址翻译的重要硬件:TLB