MIT 6.1810: xv6 book Chapter3: Page tables 笔记

Paging hardware

RISC-V page table(logically) 包含2272^{27}227个page table entries(PTE),每个PTE含一个44位的physical page number(PPN)和一些flags位

virtual address xv6使用RISC-V的Sv39模式,只有低位的39位被使用

翻译为物理地址时,取39位中高位的27位在页表中寻找PTE,PTE中的44位PPN与virtual address中低位的12位共同构成56位的物理地址

虚拟地址与物理地址均有可扩展的空间

RISC-V page table(physically) 实际上是三级树状结构,虚拟地址的27位的前9位、中9位、后9位分别对应三个页表中的PTE

这种结构能减少要分配的页表内存(中间页表和底层页表)

Translation Look-aside Buffer(TLB)

flag bits 如下图,其中包含可用V、读R、写W、执行X、用户态可访问U等flag

satp寄存器 是每个CPU自己的页表的根指针,因此不同CPU能运行不同的进程

Kernel address space

xv6启动时,会创建一个描述内存地址空间的页表

内核将虚拟地址映射为与物理地址相等,成为"直接映射"

不被直接映射的内核虚拟地址:

the trampoline page: 被映射两次,一次在所有进程页表和内核页表虚拟地址空间最高处,一次在内核页表中直接映射

the kernel stack pages: 被映射到较高的内核虚拟地址,因此guard page可以放在它下面,防止数据溢出

所有CPU在内核中运行时都可以使用该内核页表,xv6在创建该内核页表后不会再编辑它

Code: creating an address space

kernel/vm.c中kvm开头的文件为内核页表相关,uvm为用户页表相关,其他函数与两者皆有关

walk函数中,若一二级页表中未找到可用的pte且alloc参数不为0,则分配一个新的页表页,并将其物理地址放入pte中

Physical memory allocation

kernel/kalloc.c 来复习一下链表的头插法吧

将空闲节点r插入链表kmem.freelist的头部

cpp 复制代码
r->next = kmem.freelist;
kmem.freelist = r;

Process address space

0 - MAXVA (0x4000000000)

由不同页构成

地址空间内容 权限
堆 RW-U
栈(单页) RW-U
程序预初始化数据 RW-U
程序文本 R-XU

为程序文本不赋予Write权限可防止修改程序指令

为数据不赋予eXecute权限可防止跳转到数据地址执行程序

stack是单页,初始内容由系统调用exec创建,在顶部包含了命令行参数字符串和指向它们的指针数组,接下来是argc,argv\[\]等main函数执行需要的参数

xv6还在stack页下方设置了不赋予User权限的guard page来 防止栈溢出 ,实际操作系统中则会为栈自动分配更多内存来处理溢出

Code: exec

exec用一个可执行文件的内容替换当前进程的user address space

流程 (结合上图理解):

读取二进制ELF文件进内存 -> 倒序分配stack guardpage页 -> 倒序复制argc,argv及其指针,将argvargc设为0 -> 系统调用返回值a0=argc,设置a1=argv -> 提交到用户

ELF文件头读取 以/init为例

四个程序头分别为:

1.注释(可忽略)

  1. 代码段 off 从文件偏移0x1000处读取内容 vaddr 加载到虚拟地址0x0 align 对齐为2122^{12}212=4096 flags Read eXecute

  2. 数据段

4.栈信息 STACK 非LOAD类型,会被跳过

Real world

实际操作系统

RAM放在不可预测的物理地址上而非0x80000000,或利用页表将任意的的物理地址转化为可预测的虚拟地址

动态选择页的大小

address space identifiers(ASID)更新特定地址空间TLB而非刷新整个TLB

分配4096bytes大小以外的块

相关推荐
L@ncor8 小时前
第五章 基于低代码平台的智能体搭建 · 学习笔记(Coze / Dify / FastGPT / n8n)
笔记·学习·低代码·agent·prompt工程
知潮网8 小时前
被嫌弃的五仁月饼,一吨千元在养猪场翻了身
笔记
2601_960631238 小时前
中药前处理及提取的工艺环节与技术要点
笔记
2601_965384268 小时前
口腔黏膜清洁中的几何约束与流体动力学边界层问题分析
经验分享·笔记
一米阳光86619 小时前
软考高级【信息系统项目管理师】高项重要考点(9)组织 助你顺利上岸!
笔记·职场发展·软考·高项·信息系统项目管理师·高级职称
白杨尚青9 小时前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
Chen—LSN9 小时前
C语言——⽂件操作(1)
c语言·开发语言·c++·经验分享·笔记·算法·链表
Chen—LSN10 小时前
C语言——文件操作(2)
c语言·开发语言·c++·经验分享·笔记·算法·c#
Lintongzg10 小时前
千卡训练的隐形账单:通信不是瓶颈
笔记·学习·性能优化·llm
LuminousCPP11 小时前
从零开始学 C++(三):类和对象入门|从 struct 到 class,理解封装、对象与 this 指针
c++·笔记·学习·类和对象