[MIT 6.S081] Lec 4: Page tables 笔记

Lec 4: Page tables

Outline

  1. Address spaces 地址空间
  2. paging HW 支持页表(虚拟内存)的相关硬件
  3. xv6 vm code+layout

Address Spaces

强隔离性

Page Tables

概述

用于实现进程创建不同地址空间
由 CPU 和 内存管理单元(Memory Management Unit, MMU)实现
页表存放在内存中, 有专门寄存器记录其物理地址. RISC-V 中为 SATP 寄存器.
在这里插入图片描述
MMU 用于完成虚拟地址到物理地址的转换

地址划分

以页(page)为单位进行内存划分. RISC-V 中一页(page)为 4KB.
虚拟地址划分为 index 和 offset 两个部分. RISC-V 中, 虚拟地址 64位, 有效地址位数为 39 比特位: 27位 index, 12位 offset
物理内存地址 56 位: 44 位为物理页号(Physical Page Number, PPN), 12 位为页内偏移(offset)
在这里插入图片描述

RISC-V 页表实现 - 三级页表结构

在这里插入图片描述

  • 虚拟地址: 64bit: 27bit 索引(L2, L1, L0), 12bit 页内偏移
  • 物理地址: 64bit: 10bit 保留, 44bit索引(物理页号PPN), 10bit 标志位

27bit 的 index 划分为 3 个 9bit 的索引 (L2, L1, L0).
分为顶级页目录(Top Level Page Directory), 中间级页目录(Middle Level Page Directory) 和 最低级页目录(页表).
页目录中一个条目被称为页表项(Page Table Entry, PTE), 8Bytes. 一个页目录 4KB, 有 512 个 PTE. 每个 PTE 中有 44bit PPN 和 10 bit Flags. 页目录中存的为物理地址(SATP 寄存器中也是物理地址).
顶级页目录由 L2 做索引, L1 做偏移; 中间级页目录由 L1 做索引, L0 做偏移.
标志位:

  • Valid: 表示 PTE 是否有效. 无效则表明不能使用其来获取虚拟地址.
  • Readable/Writable: 是否可读/写该页
  • Executable: 是否可执行该页中的指令
  • User: 该页是否可被用户空间的进程访问

页表缓存(TLB)

页表缓存(Translation Lookaside Buffer, TLB)
切换页表时, TLB 会被清空.
MMU 和 TLB 存在于每个 CPU 核中. 根据处理器中 Cache 是否有由物理地址索引, 来决定在 TLB 之后或之前进行地址翻译.
3 级页表由硬件实现. MMU 是硬件. XV6 中的 walk() 函数也实现了页表查找功能, 返回对应的某个 PTE. walk() 函数存在的原因包括: 用于操作系统设置最初的页表; 用于内核空间向用户空间拷贝数据.

内核页表分布

  • 注: 是内核的页表

左边为内核的虚拟地址空间分布. 右上为物理内存空间(DRAM), 右下为 I/O 设备地址空间.

  • boot ROM: Boot 只读存储器. 主板上电最初执行, 引导加载操作系统.
  • PLIC: 中断控制器(Platform-Level Interrupt Controller)
  • CLINT: Core Local Interruptor, 中断一部分. (在最新的 xv6 指导书中, 该部分未在虚拟地址空间中出现)
  • UART0: Universal Asynchronous Receiver/Transmitter, 复制与 Console 和显示器交互.
  • VIRTIO disk: 与磁盘进行交互.

在这里插入图片描述
新版 xv6 内核地址空间分布(区别在 CLINT 部分在虚拟空间移除):
在这里插入图片描述
内核栈(Kstack)对应的物理地址被映射了 2 次, 还有一次时在 Kernel data中. 但一般使用上面带 Guard page 的. 不同的进程有不同的内核栈.
Guard page 一般不映射到物理内存, 其 PTE 的 Valid 位未被设置, 用于判断内核栈是否越界.
虚拟内存中的"Free memory"部分会存放用户进程的页表, text 和 data.

用户进程虚拟地址空间分布: 在这里插入图片描述

XV6 页表代码

kernel/main.c-main()
-> kvminit() 创建页表
-> kvminithart() 设置 SATP 寄存器, 之后所有内存地址均为虚拟地址, 地址翻译开始

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值