文章

《Operating Systems: Three Easy Pieces》学习笔记(十一) 机制:地址转换

高效、灵活地虚拟化内存。需要一种基于硬件的地址转换(hardware-based address translation),简称为地址转换(address translation)。将指令中的虚拟(virtual)地址转换为数据实际存储的物理(physical)地址。

虚拟地址映射

F15.1

用户进程在物理内存中并不是从 0 地址开始的

动态(基于硬件)重定位(dynamic relocation)

进程的虚拟地址都是从 0 开始的

进程中使用的内存引用都是虚拟地址(virtual address),硬件接下来将虚拟地址加上基址寄存器中的内容,得到物理地址(physical address),再发给内存系统。

还有个界限寄存器,用于限制进程地址空间范围,进程不能访问为超过该值限制的虚拟地址空间,比如限制 16KB,则不能访问 17KB 的内存,硬件应该阻止转换成物理地址

T15.1

硬件支持:总结

动态重定位:硬件要求

硬件要求解释
特权模式需要,以防用户模式的进程执行特权操作
基址/界限寄存器每个 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 进行授权

© Kai. 保留部分权利。

浙ICP备20006745号-2,本站由 Jekyll 生成,采用 Chirpy 主题。