其他分享
首页 > 其他分享> > 6.s081 : 页表

6.s081 : 页表

作者:互联网

CH3 Page tables

os通过页表来给每个进程提供私有的地址空间和内存. 页表决定了什么是内存地址以及物理内存的什么部分可以被获取. 它允许将多个进程地址空间存放在同一个物理内存中. 同时也允许将相同内存映射到几个不同的地址空间(trampoline页).

Paging hardware

RISC-V指令(user和kernel)都操作虚拟地址, 而内存是由物理地址索引的. RISC-V页表在这两种地址之间建立关联(通过将虚拟地址映射到物理地址).

QQ20210606-191501@2x.png

xv6只使用39 bits的虚拟地址, 还有25 bits未使用. 一个页表有2^27个页表条目(PTE, page table entry). 每个PTE都保存着44-bit的物理页号(PPN, physical page number)和一些标志位.

页表硬件将虚拟地址的前27(27/39)位用作索引页表, 后12位与通过前27位索引到的PTE中的PPN结合为56位的物理地址(一个页的大小为2^12=4096 bytes).

QQ20210606-194252@2x.png

但是真正的翻译是分三步, 第一层页表的物理地址存放在satp寄存器中, 第一层L2通过9 bits索引512个PTE, 每个PTE中的PPN保存着下一层页表的物理地址, 下一层也是一样, 知道最后一层PTE中存放的PPN是要翻译的最终物理地址.

如果查找序列中3个PTE任意一个PPN不存在, 那么会page-fault exception. 由于通常大范围的PTE都为空, 三层查找可以大大节省物理内存(如果第一层只有一个PTE, 那么剩余的511个PTE中的PPN为空, 那么就不需要为其分配下一层页表, 这样就只需要2^16 * 2^16 + 2^6).

QQ20210606-194319@2x.png

每个PTE有10位标志位, 用来告诉翻译硬件虚拟地址如何被允许使用.

内核通过将根页表页的物理地址写入satp寄存器来使用一个页表. 每个cpu都有自己的satp, 所以不同的cpu可以运行不同进程.

物理内存指的是DRAM中的存储单元, 每个字节的物理内存分配了一个地址. 指令只使用虚拟地址, 通过翻译硬件翻译为物理地址并发送到DRAM硬件来读写.

Kernel address space

每个进程都有一个页表来描述进程的用户地址空间, 以及只有一个页表来描述内核地址空间.

QQ20210606-210630@2x.png

物理内存从0x80000000开始, 并至少到0x86400000结束(PHYSTOP). 在0x80000000以下的物理地址映射着设备, qemu通过控制寄存器来控制这些设备. 内核可以通过读写这些特殊的物理地址来和设备交互, 这种读写是直接和设备硬件交流的而不是物理内存.

内核是直接映射的, 也就是说, 虚拟地址与物理地址是一样的(内核存储在虚拟地址和物理地址的KERNBASE=0x80000000处). 直接映射简化了内核读写物理内存的代码.

但有些内核虚拟地址不是直接映射:

内核的trampoline和text页都是PTE_R和PTE_X.

Code: creating an address space

大多数操作地址空间和页表的代码都在vm.c(kernel/vm.c). pagetable_t(要么是内核页表, 要么是每个进程页表)是指向RISC-V根页表页的指针.

几个重要的函数:

物理内存分配

xv6在运行时, 会分配和释放从内核顶部到PHYSTOP(0x86400000)的物理内存. 一次分配和释放一页(4096bytes).

物理内存分配器

分配器在kalloc.c中, 分配器是一个可分配物理内存页的空闲链表.

main调用kinit函数来初始化分配器. kinit通过初始化空闲链表来保存从内核顶部到PHYSTOP的内存(128MB).

kfree通过将要释放的内存中的每一个字节设置为1, 这会导致之后使用这段空闲内存的代码只能看到垃圾数据从而更快崩溃. 之后将pa转化为run指针, 并将其保存在空闲链表中.

进程地址空间

当一个进程需要内存时, xv6先使用kalloc来分配物理内存, 之后将指向新分配的物理内存的PTE加入到该进程的页表中, 并设置标志位.

几个页表特性:

QQ20210608-154831@2x.png

栈占一个页. 先是保存着args参数和指向args参数的指针, 接下来是允许程序从main开始运行的值. 为了检测栈是否溢出, 在栈下放置了一个guard页, 有效位设置为0.

标签:内核,PTE,虚拟地址,物理地址,页表,s081,内存
来源: https://www.cnblogs.com/rainbowg0/p/15084420.html