现代操作系统-原理与实现(上)【银杏书-读书笔记】看看多久才会读完---买于20年双⼗⼀
【来⾃未来的更新】已于2021年5⽉16⽇看完
本篇为上集,戳这⾥~~~~
⽬录
第1章-操作系统概述
从硬件⾓度
对硬件进⾏管理,处理各种错误
对硬件进⾏抽象,形成不依赖硬件的资源
从应⽤⾓度
提供不同的接⼝,满⾜不同类型的访问控制,应⽤间交互等服务
进⾏资源分配与管理
操作系统提供不同层次的接⼝
1. 系统调⽤接⼝,例如printf【printf 从应⽤程序-》libc-》下陷处理-》系统调⽤处理】[从应⽤程序-》libc-》是在⽤户态] [从下陷处
理-》系统调⽤处理 是在内核态]
linux内核设计与实现 pdf2. POSIX接⼝【可移植操作系统接⼝】,例如glibc
3. 领域应⽤接⼝,例如AUTOSAR,这种算框架了
第2章-硬件结构
冯诺依曼-机,包含
1. 中央处理器
2. 存储器
3. 输⼊输出
指令集是ISA【指令集架构】的重要组成部分,AArch64属于RISC【精简指令集计算机】
特权级在AArch64中叫做异常级别,包括
1. EL0 应⽤层跑在这【⽤户态】
2. EL1 操作系统跑在这【内核态】
3. EL2 虚拟化在这⾥【虚拟机场景⽤】
4. EL3 TrustZone相关【负责切换安全世界和普通世界】
何时从EL0切换到EL1
1. 应⽤层程序⽤系统调⽤
2. CPU收到中断
3. 应⽤层触发了异常
其中1和2为同步的CPU特权级切换
3为异步的CPU特权级切换
从EL0切换到EL1
1. 触发异常的指令地址【PC】保存到ELR_EL1
2. 异常原因保存到ESR_EL1
3. CPU将栈指针从SP_EL0切换到SP_EL1,在异常向量表中选择对应的异常处理函数
4. CPU还要保存⼀些状态
寄存器是ISA的重要组成,包括
1. 通⽤寄存器
2. 栈指针寄存器
3. 链接指针
EL1下有两个页表基地址寄存器,这个和虚拟内存有关系
Cache
这个是为了加快CPU访问数据的速度,包括:
若⼲个缓冲⾏,每⼀个⾏包括
⼀个有效位
⼀个标记地址
为了通过物理地址到对应的缓存,物理地址在逻辑上分为Tag,Set以及Offset三段
物理地址中Set段能够表⽰的最⼤数⽬叫做组
⽀持的最⼤Tag数叫做路
缓存结构和缓存寻址的图请看书
第3章-操作系统结构
设计操作系统的原则【机制与策略分离】
策略:做什么【输⼊处理,启动加载....】
机制:如何做【调度⽅法...】
管理复杂系统的⽅法
1. 模块化
2. 抽象
3. 分层
4. 层级
模块化:分⽽治之,将复杂系统分解成⼀系列的模块,保证模块之间的界限,⾼耦合低内聚,使之有独⽴性
抽象:接⼝与实现分离,⽆需关⼼各个模块之间的内部实现
分层:将模块按⼀定的层次划分,约束内部模块之间的交互⽅式
层级:将功能相近的模块划分在⼀个⼦系统
操作系统的内核架构
1. 简要结构
2. 宏内核
3. 微内核
4. 外核
5. 多内核
简要结构:应⽤程序和操作系统在同⼀个地址空间,没有虚拟内存管理,特权级隔离等功能,任何⼀个模块出问题,系统就崩溃了
宏内核:所有的操作系统模块运⾏在内核态
微内核:将单个的内核功能拆分,作为服务部署在⽤户态,仅有很⼩部分的内核运⾏在内核态,服务提供进程间通信的功能使之互相协作
外核:操作系统与应⽤程序挂钩,应⽤程序要啥就装对应的功能,内核只负责对操作系统在多个操作系统之间的多路复⽤
多内核:通过多内核管理异构多核设备
第4章-内存管理
应⽤程序是⾯向虚拟内存编写的,CPU会翻译地址到物理地址,操作系统来管理虚拟地址和物理地址的映射
设计时的三个⽬标
1. ⾼效性【不应占⽤过多的物理内存资源】
2. 安全性【使不同应⽤程序互相隔离】
3. 透明性【应⽤层编程时感觉不到内存的抽象】
CPU通过MMU进⾏地址翻译,为了加速翻译,现代CPU都有TLB【转址旁路缓存】
有两种机制
1. 分段机制
2. 分页机制
分段机制不多写了,⽬前⽤的多的是分页机制的
分页机制
⼀个虚拟地址将被划分成两部分
1. 虚拟页号
2. 页内偏移量
多级页表也是⼀样的结构,多级页表允许部分空洞,单级页表则需要每⼀项都真实存在
AArch64 下的多级页表
虚拟地址低48位参与地址翻译,页表级数为4,虚拟页⼤⼩4KB
物理地址划分为连续的4KB⼤⼩物理页,⼀个虚拟页映射为⼀个物理页,低12位对应页内偏移量
整个页表的起始地址放在页表基地址寄存器中,对应的就是第0级的页表页
每⼀个页表页占⽤物理内存的⼀个物理页[4KB]
每⼀个页表项占⽤8字节,存访问权限。
因此,⼀个页表页包含512个页表项[4K/8],虚拟地址中对应于每⼀级页表的索引都是9位【2^9】63-48位: 全0或者全1
47-39位:0级页表索引值
38-30位:1级页表索引值
29-21位:2级页表索引值
20-12位:3级页表索引值
11-0位: 页内偏移量
如何翻译呢?
1. 先根据页表基地址寄存器到第0级页表页
2. ⽤0级页表索引值作为页表项索引,读取第0级页表页中对应的页表项,这个页表项⼜对应下⼀级的页表页物理地址
3. 以此类推,最后结合页内偏移量就可以得到最终的物理地址
TLB【转址旁路缓存】
多级页表的出现使得MMU翻译地址的过程要查多个页表页中的页表项
为了减少次数,加⼊TLB加速翻译
TLB缓存了虚拟页号到物理页号的映射关系
MMU先把虚拟页号作为键值去查询TLB的缓存项
到【TLB命中】就直接得到物理页号,否则【TLB未命中】就要查页表
由于这个TLB是CPU的⼀部分,所以它的⼤⼩是有限的,它是由硬件直接进⾏管理的,这样才能⾼效利⽤
TLB未命中,就去查页表,然后填进TLB
如果已满,按照预定的⽅式替换掉某⼀项
如果再次翻译⼀样的页号,那么就可以马上得到页表了。
TLB与当前页表不⼀致是需要刷新的,如何最⼩化刷新对应⽤程序带来的影响,则是操作系统与CPU⼀起需要处理的。
换页和缺页
换页:当物理内存不⾜时,操作系统把物理页的数据写到磁盘等容量更⼤的设备中,然后就可以回收物理页回来了,此时的物理页处于【已分配但未映射到物理内存】的状态
缺页:当应⽤程序访问了处于【已分配但未映射到物理内存】的状态的物理页,那么就会触发缺页异
常,操作系统会调⽤预先设置的处理函数,然后到⼀个空虚的物理页,将之前的数据重新写回到该物理页上,并且在页表上填写该虚拟地址到这⼀个物理页的映射。
由于换页涉及到磁盘操作,所以操作系统会引⼊预取机制优化。
当应⽤层申请虚拟内存的时候,操作系统可以把新分配的虚拟页标记为已分配但未映射⾄物理内存的状态,不需要为这个虚拟页分配对应的物理页。只有要访问时才会触发缺页异常,真正为虚拟页分配物理页,并在页表⾥填写映射。
初次访问时产⽣的缺页异常会导致访问延迟的增加,可以利⽤应⽤程序访问时的时空局限性改善。
虚拟页处于未分配或者已分配但未映射⾄物理内存状态时,应⽤程序访问该虚拟页会触发缺页异常。
Linux中应⽤程序的虚拟地址空间被实现由多个虚拟内存区域VMA组成
当应⽤程序发⽣缺页异常时,操作系统通过判断虚拟页是否属于该应⽤程序的某个虚拟内存区域区分该页所处的分配状态
若属于,则该页处于已分配但未映射⾄物理内存的状态
否则,该页处于未分配状态。
页替换策略
如果空闲的物理页已经⽤完或者⼩于某个阈值,策略便会选择某些物理页换出到磁盘,让出空间,最⼩化缺页异常发⽣的次数进⽽提升性能
常见的页替换策略有:
1. MIN策略【优先选择未来不会再⽤的页】
2. FIFO策略【优先选择最先换⼊的页】
3. SECOND CHANCE策略【每⼀个物理页号维护⼀个访问标志位,如果没有置位,则换出该页,反之对应页挪动到队尾,从新的队头
重新开始换出的内存页】
4. LRU策略【优先选择最久未被访问的页】
5. MRU策略【优先选择最近访问的页】
6. 时钟算法策略【换⼊物理内存的页号排列成⼀个时钟的形状,该时钟有⼀个针臂,指向新换⼊内存
的页号的后⼀个。每次需要选择换
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论