Operating Systems: Three Easy Pieces
目标:易用性,性能
虚拟化
CPU
-
进程
-
接口
-
创建
- 加载 → 分配栈,堆 → 其他初始化任务 → 在程序入口地址启动程序 (转移对 CPU 的控制权)。
-
销毁
-
等待
-
其他控制
-
状态
- 运行
- 就绪
- 阻塞
-
Unix 系统
- fork();exec();wait()
-
-
机器状态
- 程序计数器
- 栈指针
- 帧指针
-
懒加载
-
运行时栈
-
文件描述符
-
数据结构
- 进程列表
- 寄存器上下文
- 进程控制块(PCB)
-
-
调度
-
指标
-
周转时间
- 性能指标
-
响应时间
- 交互
-
-
先进先出 (FIFO)
-
最短作业优先 (SJF)
-
最短完成时间 (STCF)
-
轮询 (RR)
-
多级反馈队列 (MLFQ)
-
目标
- 优化周转时间
- 最小化响应时间
-
机制
- 观察作业的执行并相应地对其进行优先级排序
-
-
比例份额调度
-
彩票调度
- 每隔一段时间,举行抽奖来决定下一个应该运行哪个进程;应该给应该运行得更频繁的进程更多的中奖机会。
-
步调度
-
完全公平调度 (CFS)
-
特点
- 不是特别适合I/O
- 没有解决票务或优先分配的难题
-
-
多处理器调度
-
多处理机架构
-
缓存
- 局部性原理
- 缓存命中
- 缓存亲和性调度
-
总线窥探
- 无效化
- 更新
-
同步
-
-
单队列多处理机调度 (SQMS)
- 扩展性问题
-
多队列多处理机调度 (MQMS)
- 负载均衡问题
- 工作窃取
-
-
-
分时机制
- 上下文切换
-
有限直接执行
-
受限的操作
- 用户态
- 内核态
- 处理机状态字
-
进程间切换
-
等待系统调用(合作方法)
-
操作系统控制一切(非合作方法)
- 时钟中断
- 中断处理程序
-
-
内存
-
目标
- 透明
- 效率
- 保护
-
地址空间
-
地址转换
-
基于硬件的地址转换
-
动态重定位
-
基址寄存器
-
界寄存器
-
问题
- 动态存储残片
-
解决
- 分段
-
-
-
分段
-
段号
-
保护位
-
细粒度
-
粗粒度
-
段表
-
系统支持
-
外部碎片
-
压缩物理存储
-
空闲列表管理算法
- 最佳适配
- 最差适配
- 伙伴算法
-
稀疏地址空间
-
-
分页
-
页表
-
页表项 (PTE)
- 物理帧号 (PFN) / 物理页号(PPN)
- 有效位
- 保护位
- 存在位
- 脏位
- 访问位
- 读写位
- …
-
线性页表
-
-
页帧
-
虚拟页号(VPN)
-
问题
- 页表会导致系统运行太慢
- 占用太多内存
- 大页会导致内部存储残片
-
-
分页和段
-
多级页表
-
页目录
-
页目录项 (PDE)
- 有效位
- 页帧号
-
-
倒排页表
-
-
内存管理单元 (MMU)
-
转换后备缓冲器 (TLB)
- 命中
- 未命中
-
-
-
-
空闲空间管理
-
底层机制
- 分裂与合并
- 跟踪已分配区域的大小
- 嵌套空闲链表
- 堆的增长
-
策略
-
最佳适配
-
最差适配
-
首次适应
-
循环首次适应
-
分离的空闲链表
- 如果一个特定的应用程序有一个(或几个)常用大小的请求,保留一个单独的列表来管理这种大小的对象;所有其他请求都被转发到一个更通用的内存分配器
-
伙伴分配
-
-
-
交换
-
机制
-
硬盘驱动
-
交换空间
-
磁盘地址
-
存在位
-
页错误
-
页错误处理程序
-
页入
-
页出
-
交换守护进程
- 高水线
- 低水线
-
-
策略
-
缓存管理
- 存储器平均访问时间 (AMAT)
- 命中率
- 缺失率
-
最优替换策略
-
先进先出(FIFO)
-
随机
-
最不经常使用(LFU)
-
最近最少使用 (LRU)
-
近似 LRU
- 时钟置换算法
-
页面选择策略(何时将一个页面放入内存)
-
请求页面调度
- 当访问页面时,操作系统将页面放入内存中
-
预取
-
-
-
抖动
- 进程工作集
- 接纳控制
-
-
类型
- 栈内存(自动内存)
- 堆内存
-
Unix
-
系统调用
- brk
- sbrk
- mmap()
-
库函数
-
malloc()
-
free()
-
错误
- 段错误(忘记分配内存)
- 缓冲区溢出(没有分配足够的内存)
- 未初始化读(忘记初始化内存)
- 内存泄漏(忘记释放内存)
- 悬空指针(在使用完之前释放内存)
- 二次释放(重复释放内存)
-
-
并发
线程
-
接口
- 创建
- 完成
-
程序计数器(PC)
-
私有寄存器
-
上下文切换
-
线程控制块(TCB)
-
线程本地存储
-
作用
- 程序并行化
- 避免由于缓慢的I/O而阻塞程序进程
-
调度
- 数据竞争
- 不确定性
- 临界区
- 互斥
- 同步原语
锁
-
度量
- 正确性
- 公平
- 性能
-
条件变量
-
信号量
- 二进制信号量
- 用于排序的信号量
- 读写锁
- 线程节流
-
实现
-
控制中断
- 只在有限的上下文中用作互斥原语
-
Test-And-Set 指令构建自旋锁
- 前提:要使用抢占式调度器
- 避免太多的自旋:Yield
-
compare-And-swap 或 compare-and-exchange 指令
-
Load-Linked 和 Store-Conditional 指令
-
Fetch-And-Add 指令
-
并发BUG
-
死锁
-
产生死锁的必要条件
- 互斥;持有并等待;不可抢占;循环等待
-
预防
-
解决循环等待
- 提供获取锁的总顺序
- 部分有序
-
解决持有并等待
- 任何时候,任何线程获取一个锁,它首先获得全局预防锁。
-
-
避免
- 检测
- 恢复
-
-
违反原子性
- 多个内存访问之间期望的序列化性被违反了(例如,代码区域是原子性的,但在执行过程中原子性没有被强制执行)
-
顺序冲突
- 两个(组)内存访问之间的期望顺序被翻转(即,A应该总是在B之前执行,但在执行过程中不强制执行该顺序)
基于锁的并发数据结构
-
并发计数器
- 简单计数(扩展性差)
- 近似计数(扩展性好)
-
并发链表
-
并发队列
-
并发哈希表
基于事件的并发
-
事件循环
-
接收事件
-
事件处理程序
-
问题
-
阻塞的系统调用
-
手动堆栈管理
- 当事件处理程序发出异步I/O时,它必须打包一些程序状态,以便下一个事件处理程序在I/O最终完成时使用。这种额外的工作在基于线程的程序中是不需要的,因为程序需要的状态在线程的堆栈上。
-
只能应用于单处理机
-
不能很好地与某些类型的系统活动集成,例如分页。
-
随着各种例程的确切语义发生变化,基于事件的代码可能很难长期管理
-
-
解决
-
异步 I/O
-
状态管理
- 在某些数据结构中记录完成处理此事件所需的信息;当事件发生时(即当磁盘I/O完成时),查找所需的信息并处理该事件
-
新的并发程序模型
- MapReduce
持久化
I/O 设备
-
系统架构
- 内存总线
- 外围 I/O 总线(PCI)
- 直接媒体接口(DMI)
-
设备驱动
-
标准设备
-
硬件接口(寄存器组)
- 状态
- 命令
- 数据
-
内部结构
- 微控制器
- 内存
- 其他硬件专用芯片
-
-
标准协议
- 轮询设备
- 发送一些数据到数据寄存器
- 向命令寄存器写入命令
- 再次轮询设备来等待设备完成
-
设备交互
-
方法
- 明确的 I/O 指令
- 内存映射 I/O
-
技术
- 中断
- 直接内存访问(DMA)
-
-
通过中断降低CPU开销
-
中断服务例程 (ISR)
-
混合方式
- 只进行一段时间的轮询,然后,如果设备还没有完成,就使用中断
-
合并
- 一个需要触发中断的设备首先等待一段时间,然后将中断传递给CPU
-
-
历史
- 当人们建造这些早期的机器时,很明显需要I/O支持。中断、DMA和相关思想都是快cpu和慢设备本质的直接结果;如果你当时在那里,你可能也会有类似的想法。
机械硬盘
-
接口
- 扇区
- 一次读写4KB
- 单个512字节的写入是原子的
- 访问两个相邻的块要比访问两个相距很远的块快
-
组件
- 盘片
- 盘面
- 轴
- 磁道
- 磁头
- 磁盘臂
-
延迟
-
单道
- 转动延迟
-
多道
- 寻道时间
-
-
转速 (RPM)
-
沉淀时间
-
轨道倾斜
-
多分区磁盘驱动
-
缓存(磁道续存)
-
回写缓存
-
磁盘调度
-
最短寻道时间优先(SSTF)
-
最近块优先(NBF)
-
电梯(扫描)调度
-
F-SCAN
- 在执行扫描时冻结要服务的队列,此操作将在扫描期间传入的请求放入队列中,以便稍后进行服务。
-
C-SCAN
- 只从外到内扫,然后在外层轨道重置重新开始
-
-
最短定位时间优先(SPTF)
-
-
I/O合并
基于闪存的固态硬盘
-
磨损
-
单层单元闪存(SLC)
-
多层单元闪存(MLC)
-
操作
- 读(页)
- 擦除(块)
- 编写(页)
-
干扰
- 读干扰
- 编程串扰
-
闪存转换层(FTL)
-
性能提升
- 并行利用多个闪存芯片
- 减少写入放大
-
损耗均衡
-
日志结构的固态硬盘
-
设备过载
- 通过增加额外的闪存容量,可以延迟清理并推到后台,也许在设备不太繁忙的时候完成。
-
映射表
-
基于块的映射
-
混合映射
-
部分合并
-
完全合并
-
廉价磁盘冗余阵列(RAID)
-
接口
- 对于上面的文件系统,RAID看起来像一个大的、(希望是)快的和(希望)可靠的磁盘。就像单个磁盘一样,它表现为块的线性数组,每个块都可以被文件系统(或其他客户机)读或写。
-
故障模型
-
失败终止
- 磁盘只能处于两种状态中的一种:工作或故障
-
-
评估
-
容量
-
可靠
-
性能
- 顺序
- 随机
-
-
Level 0:分条
- 块大小
-
Level 1:镜像
- RAID-10
- RAID-01
-
Level 4:奇偶校验
- 异或
-
Level 5:旋转的奇偶校验
-
热备份
-
软件RAID系统
文件系统
-
接口
-
文件
-
创建
- 文件描述符
- 引用计数
-
访问
-
删除
-
读
-
写
- 立即写
-
重命名
-
类型
-
-
目录
-
创建
-
读取
-
删除
-
目录树
- 根目录
- 子目录
- 分隔符
- 绝对路径
- 相对路径
-
-
-
硬引用
- 不能创建指向目录的引用
- 不能硬链接到其他磁盘分区中的文件(因为inode号只在特定文件系统内唯一,而不是跨文件系统)
-
软引用(符号链接)
- 悬摆指针问题
-
访问控制
-
访问位
-
对象
- 所有者
- 组
- 其他
-
类型
- 读(4)
- 写(2)
- 执行(1)
-
-
访问控制列表(ACL)
-
-
实现
-
文件系统的数据结构
-
文件
-
inode(index node)
- 这些节点最初被安排在一个数组中,当访问特定的inode时,数组会被编入索引。
-
i-number
-
多级索引
-
-
目录
- 键值对(条目名称,索引节点号)列表
-
-
访问方法
-
总体结构
-
块
-
数据区域
-
元数据
-
分配结构
- 空闲链表
- 位映射
-
超级块
-
-
空闲空间管理
- 预分配策略
-
缓存
-
静态划分
-
动态划分
- 统一页面缓存
-
-
-
挂载
- 挂载点
-
裸盘接口
快文件系统(FFS)
-
磁盘感知
-
组织结构
- 圆柱体组
- 块组
-
分配策略
- 把相关的东西放在一起
-
大文件异常
-
摊销:为每个开销做更多的工作来减少开销的过程
-
子块
-
参数化:计算出一个特定磁盘在布局时应该跳过多少块,以避免额外的旋转。
-
历史教训:把磁盘当作磁盘来对待
日志结构的文件系统
-
动机
- 系统内存正在增长
- 随机 I/O 性能和顺序 I/O 性能之间存在很大的差距
- 现有的文件系统在许多常见的工作负载上表现很差
-
顺序写磁盘
-
Inode Map
-
检查点区域
-
递归更新问题
-
垃圾收集
-
版本控制文件系统
-
确定区块活性
-
段汇总块
完全一致性
-
崩溃一致性问题
-
系统文件检查器(fsck)
-
唯一确保的是文件系统元数据在内部是一致的
-
检查
- 超级块
- 空闲块
- inode 状态
- inode 链接
- 副本节点
- 坏块
- 目录
-
问题
- 复杂
- 慢
-
-
预写式日志
-
数据日志
- 事务标识(TID)
- 物理日志
- 逻辑日志
- 检查点
-
恢复
- redo 日志
-
日志批更新
-
循环日志
-
元数据日志(命令日志)
-
问题:可能最终指向垃圾数据
-
解决:先将数据块(普通文件)写入磁盘,再将相关元数据写入磁盘
-
块重用问题
- 永远不要重用块,直到该块的删除被检出日志。
- 向日志中添加新类型的记录,称为撤销记录
-
-
-
软更新
-
写时复制
-
基于后指针的一致性(BBC)
-
乐观的崩溃一致性
-
崩溃情景
-
只有数据块被写入磁盘。
-
只有更新的 inode 被写入磁盘
- 垃圾数据
-
只将更新的位图写入磁盘
- 空间泄漏
-
索引节点和位图被写入磁盘,而没有数据
-
写入的是 inode 和数据块,而没有位图
-
写入位图和数据块,但没有写入 inode
-
数据完整性和保护
-
磁盘失效模型
- 潜在扇区错误
- 块损坏
-
纠错码
-
无声的故障
-
双奇偶校验
-
损坏检测
-
校验和
- 异或
- 相加
- 弗莱彻校验和
- 循环冗余校验(CRC)
- 冲突
-
校验和布局
-
存储校验和
-
计算校验和
-
-
误写
- 物理标识
-
写丢失
- 写校验
- 写后读
-
磁盘擦洗
- 通过定期读取系统的每个块,并检查校验和是否仍然有效,磁盘系统可以减少特定数据项的所有副本被损坏的几率。典型的系统计划每晚或每周进行扫描
分布式系统
-
通过收集一组机器,我们可以构建一个看起来很少发生故障的系统,尽管它的组件经常发生故障。
-
性能
-
安全
-
通信
-
不可靠的通信层
- UDP/IP
- sockets
-
可靠通信层
- 确认 ACK
- 超时
- 重试
- 序列计数器
- TCP/IP
-
-
抽象
-
分布式共享内存系统(DSM)
-
允许不同机器上的进程共享一个大的虚拟地址空间
-
问题
- 处理失败困难
- 性能
-
-
远程过程调用(RPC)
-
使在远程机器上执行代码的过程像调用本地函数一样简单和直接
-
存根生成器(协议编译器)
-
通过自动化来消除将函数参数和结果打包到消息中的一些痛苦
-
用户端
- 创建消息缓冲区
- 将所需的信息打包到消息缓冲区中
- 将消息发送到目标RPC服务器
- 等待回复
- 解包返回代码和其他参数
- 返回给调用者
-
服务端
- 解封消息
- 调用实际的函数
- 打包结果
- 发送回复
-
-
运行时库
-
处理 RPC 系统中的大部分繁重工作
-
命名问题
-
传输协议的选择
-
大参数问题
-
字节顺序
- 大端
- 小端
-
是否向客户端公开通信的异步性质,从而启用一些性能优化。
-
-
-
SUN 的网络文件系统(NFS)
-
C/S 架构
- 方便数据共享
- 集中化管理
-
客户端文件系统
- 系统调用
-
服务端文件系统
-
开放式通信协议
-
NFSv2
-
目标:简单而快速的服务器崩溃恢复
-
无状态协议
-
文件句柄
- 用于唯一地描述特定操作将要操作的文件或目录
- 卷标识符
- inode 号
- 生成号
-
幂等操作
-
目标:提升性能
-
客户端缓存
-
写缓存
-
缓存一致性问题
- 更新可见性
- 过期的缓存
- 关闭时刷新
- 在使用文件的缓存内容之前,首先检查文件是否发生了更改
- 属性缓存
-
安德鲁文件系统(AFS)
-
目标:扩展性。如何设计一个分布式文件系统,使服务器能够支持尽可能多的客户机?
-
版本 1
-
基本原则
- 在访问文件的客户机的本地磁盘上进行全文件缓存
-
问题
- 路径遍历成本太高
- 客户端发出太多的 TestAuth 协议消息
- 服务器之间的负载没有均衡
- 服务器对每个客户机使用一个不同的进程,从而导致上下文切换和其他开销
-
-
版本 2
-
回调
- 服务器向客户端的一种承诺,即当客户端缓存的文件被修改时,服务器将通知客户端
-
文件标识符(FID)
-
缓存一致性
- 更新可见性
- 缓存过时
- 不同机器上进程之间的一致性
- 同一机器上进程之间的一致性
-
崩溃恢复
- 心跳消息
-
其他
安全
-
目标
- 保密性
- 完整性
- 可用性
-
设计原则
-
经济机制
-
更小更简单
-
故障保护默认值
-
完全中介
-
开放式设计
-
权限分离
-
最小特权
- 当你允许某人接触某物时,你不仅依赖于他们的诚实,还依赖于他们的谨慎
-
最小公共机制
-
可接受性
-
-
认证
-
将标识符附加到进程
- 复制创建它的进程的标识
- 可以根据流程所属的人工用户为其分配标识
- 用户登录
-
用户验证
-
基于你所知道的认证
-
密码
-
其他人不知道密码
- 存储密码的 hash 值,而不是密码本身
-
其他人猜不出来
- 字典攻击
- 加盐
-
-
-
基于您所拥有的内容进行身份验证
- USB 令牌
- 加密狗
- 手机验证
-
基于身份的认证
-
假阴性
- 无法将真实用户的图片与存储的版本匹配
-
假阳性
- 对测量数据和存储数据之间的差异过于宽容,将验证一个与他们自称的身份不同的用户
-
生物识别的本质是任何实施都会有一个典型的假阳性和假阴性率。两者都不好,所以你希望两者都很低
-
调节生物识别系统以达到交叉错误率并不总是如此,因为您可能更关心一种错误而不是另一种错误
-
-
多因子验证
-
验证非人类
- 密码
-
用户组
-
-
-
访问控制
-
找出请求是否符合我们的安全策略
-
主体
- 希望执行访问的实体
-
对象
- 主体想要访问的东西
-
访问
- 处理对象的某种特定模式
-
授权
- 将确定是否允许特定主体对特定对象执行特定形式的访问的过程
-
引用监视器
-
只给主体分配属于它的对象
-
访问控制表(ACL)
- unix风格的9位ACL
- 优点
- 方便查看谁可以访问某个资源
- 方便更改
- 如果可以访问文件,就可以获得所有相关的访问控制信息(在分布式系统中特别重要)
- 缺点
- 必须将访问控制信息存储在文件附近的某个位置,并处理对长列表的潜在昂贵的搜索。
- 难以知道某个主体被允许访问的整个资源集
- 在分布式环境中,为了使 acl 有效,您需要在所有机器上有一个通用的标识视图
-
功能/能力(一种钥匙)
- 操作系统需要为每个进程维护自己的受保护功能列表
- 容易确定给定主体可以访问哪些系统资源
- 提供了一种创建具有有限特权的流程的好方法
-
强制
-
非强制
-
基于角色的访问控制(RBAC)
-
允许特定用户承担多个不相关的角色
-
类型强制
- 它使用通常称为该对象的安全上下文将详细的访问规则与特定对象关联起来
-
特权提升
- 允许谨慎地扩展权限,通常是允许特定程序使用一组超出调用它们的用户权限的权限来运行
-
通常支持比 setuid 和 sudo 操作更细的粒度和更仔细的角色分配跟踪。
-
-
-
密码学
-
密码学的好处完全依赖于密钥的保密性
-
用于保护数据的完整性
-
用于身份验证
-
形式化语义
- K:密钥
- P:明文
- D():解密算法
- E():加密算法
- H():哈希算法
- C:密文
-
对称密码学
- C = E(P, K)
- P = D(C, K)
-
公钥密码学(PK)
-
C = E(P, Kencrypt)
-
P = D(C, Kdecrypt)
-
私钥加密
- 身份验证
-
公钥加密
- 私密通信
-
缺陷:计算成本比依赖于单个共享密钥的传统密码学高得多
-
-
密码散列
- S = H§
- 用于确保数据完整性
- 要找到产生相同哈希值的两个输入,在计算上是不可行的
- 对输入的任何更改都将导致结果哈希值发生不可预测的更改
- 仅根据散列值推断输入的任何属性在计算上是不可行的
- SHA-3 算法
-
静止数据加密
-
将数据以加密形式存储
-
全磁盘加密
-
防止用户试图访问他们不应该被允许查看的数据
-
防止硬件被窃取并转移到另一台机器上后正确读取信息
-
不能防止应用程序中泄露数据的缺陷
-
不能防止系统上不诚实的特权用户
-
不能保护操作系统本身的安全缺陷
-
应用
- 存档数据可能需要复制并必须保存,但不需要使用
- 在云计算设施中存储敏感数据
- 通过应用程序执行的用户级加密
- 密码库(密钥环)
-
-
加密功能
- 不可伪造
-
-
分布式系统的安全
-
两大问题
- 分布式系统中的其他机器可能没有正确地实现您想要的安全策略,或者它们可能是冒充可信合作伙伴的对手。我们不能控制远程系统,但我们仍然必须能够信任它们提供给我们的凭证和功能的有效性。
- 分布式系统中的机器通过一个网络进行通信,没有任何一台机器能够完全控制这个网络,而且通常不能信任这个网络。对手通常对该网络具有同等的访问权限,可以伪造、复制、重放、修改、破坏和延迟我们的消息,并通常干扰我们使用该网络的尝试。
-
身份验证
-
要么要求远程计算机提供密码
-
要么要求远程计算机使用仅存储在该计算机上的私钥提供证据
-
如果有大量的参与方需要向一方进行身份验证,那么密码往往是有用的。
-
如果有一方需要向大量的方进行身份验证,那么公钥往往是有用的。
-
web cookies
- 网站发送给客户端的数据片段,目的是让客户端存储这些数据,并在下次与服务器通信时再次发送回来
-
挑战/应答协议
- 每次都会发送不同的挑战,需要不同的响应,因此攻击者无法通过监听和复制旧的挑战和响应获得优势
-
身份验证服务器
- 您与您信任的服务器进行通信,该服务器也信任您。您希望对其进行身份验证的一方也必须信任服务器。身份验证服务器以某种安全的形式为您的身份作担保
- 从某种意义上说,证书和 CA 是这种身份验证服务器的脱机版本。
- 还有更活跃的在线版本,涉及两台希望进行通信的机器与一个或多个身份验证服务器之间的各种网络交互。在线版本比离线版本更能响应安全条件的变化。不应该被认可的旧证书很难被清除,但在线身份验证服务器可以立即使受损害方的身份验证无效,并立即应用更改。
-
-
公钥认证
-
证书
- 签名的比特包
- 它包含关于拥有公钥的一方的信息、公钥本身以及其他信息
-
证书管理中心(CAs)
-
-
密码认证
-
SSL/TLS
-
安全套接层(SSL)
- 通过普通套接字移动加密数据
- 支持各种加密操作和许多不同的密码,以及在发送方和接收方之间执行密钥交换和身份验证的多种方法
-
安全传输层协议(TLS)
- SSL 的新版本
-
-
高级工具
-
HTTPS
- HTTP 的加密版本
- HTTP 通过 SSL 连接传递
- 只担保真实性
-
SSH
- 是Secure Shell的缩写,它准确地描述了该程序最初的目的
- 支持其他不基于证书或密码的身份验证选项
- SSL 的竞争对手,最常用于与远程计算机建立安全会话
-
强制安全传输技术(HSTS)
- 任何客户端与它的所有交互都将被加密保护。不能或不愿接受HTTPS的客户端将不被允许与这样的网站交互
-
-
中间人攻击
-
虚拟机
-
监视器
-
位于一个或多个操作系统和硬件之间,给每个正在运行的操作系统一种它控制机器的错觉
-
虚拟机监视器(VMM)
-
操作系统的操作系统
-
主要目标:透明性
-
动机
- 服务器整合
- 多系统体验的需求
- 测试和调试
-
CPU 虚拟化
- 机器切换
- 特权操作执行问题
- 监督者模式
-
内存虚拟化
- 机器内存
- vmm 级别的“软件 TLB”
-
信息差
- VMM 与操作系统之间
- 可能导致各种低效率
- 推断(隐式信息的一种形式)
-
减慢系统调用
-
vmm与操作系统不同,并不是为了使硬件更容易使用
-
-
-
硬件支持
- 改变了平台支持虚拟化的方式