《Operating Systems: Three Easy Pieces》学习笔记(十一) 机制:地址转换
高效、灵活地虚拟化内存。需要一种基于硬件的地址转换(hardware-based address translation),简称为地址转换(address translation)。将指令中的虚拟(virtual)地址转换为数据实际存储的物理(physical)地址。
虚拟地址映射
用户进程在物理内存中并不是从 0 地址开始的
动态(基于硬件)重定位(dynamic relocation)
进程的虚拟地址都是从 0 开始的
进程中使用的内存引用都是虚拟地址
(virtual address),硬件接下来将虚拟地址
加上基址寄存器
中的内容,得到物理地址
(physical address),再发给内存系统。
还有个界限寄存器
,用于限制进程地址空间范围,进程不能访问为超过该值限制的虚拟地址空间,比如限制 16KB,则不能访问 17KB 的内存,硬件应该阻止
转换成物理地址
硬件支持:总结
动态重定位:硬件要求
硬件要求 | 解释 |
---|---|
特权模式 | 需要,以防用户模式的进程执行特权操作 |
基址/界限寄存器 | 每个 CPU 需要一对寄存器来支持地址转换 和界限检查 |
能够转换 虚拟地址并检查 它是否越界 | 电路 来完成转换和检查界限,在这种情况下,非常简单 |
修改基址/界限寄存器的特权指令 | 在让用户程序运行之前,操作系统必须能够设置 这些值,需要特权模式 |
注册异常处理程序的特权指令 | 操作系统必须能告诉硬件,如果异常 发生,那么执行 哪些代码,需要特权模式 |
能够触发异常 | 如果进程试图使用特权指令 或越界 的内存 |
操作系统的职责
进程创建
时,操作系统从空闲列表
(free list)找到位置分配
内存空间,并标记为已用进程终止
时,操作系统需要回收
内存到空闲列表上下文切换
时,需要保存/加载
基址和界限寄存器
。比如放在进程结构或进程控制块 PCB 中。当进程
暂停
时,操作系统可以切换
其地址空间,只要分配新空间,拷贝,然后修改进程结构/PCB 里的基址寄存器
就行- 操作系统必须提供
异常处理程序
(exception handler),向硬件注册,当进程出现如越界访问等异常操作时,CPU 会执行这段异常处理程序,如终止该进程。
受限直接执行协议(动态重定位):
操作系统@启动(内核模式) | 硬件 | |
---|---|---|
初始化陷阱表 | ||
记住以下地址: - 系统调用处理程序 - 时钟处理程序 - 非法内存处理程序 - 非常指令处理程序 | ||
开始中断时钟 | ||
开始时钟,在 x ms 后中断 | ||
初始化进程表 初始化空闲列表 | ||
操作系统@运行(核心模式) | 硬件 | 程序(用户模式) |
为了启动进程 A: - 在进程表中分配条目 - 为进程分配内存 - 设置基址/界限寄存器(应该是写入进程结构) - 从陷阱返回(进入 A) | ||
恢复 A 的寄存器 转向用户模式 跳到 A(最初)的程序计数器 | ||
进程 A 运行 - 获取指令 | ||
转换虚拟地址并执行获取 | ||
执行指令 | ||
如果显式加载/保存 - 确保地址不越界 - 转换虚拟地址并执行 - 加载/保存 | ||
…… | ||
时钟中断 转向内核模式 跳到中断处理程序 | ||
处理陷阱 调用 switch()例程 - 将寄存器(A)保存到进程结构(A)(包括基址/界限) - 从进程结构(B)恢复寄存器(B)(包括基址/界限) 从陷阱返回(进入 B) | ||
恢复 B 的寄存器 转向用户模式 跳到 B 的程序计数器 | ||
进程 B 运行 - 执行错误的加载 | ||
加载越界 转向内核模式 跳到陷阱处理程序 | ||
处理本期报告 - 决定终止进程 B - 回收 B 的内存 - 移除 B 在进程表中的条目 |
参考
本文由作者按照 CC BY 4.0 进行授权