首页 > 其他分享 >MIT 6.S081 页表

MIT 6.S081 页表

时间:2023-07-03 20:45:45浏览次数:39  
标签:kernel 映射 虚拟地址 MIT 物理地址 页表 table S081 page

Paging hardware

总的来说,Xv6 的虚拟内存到物理内存的映射方式与 x64 是一致的,都是使用页表来进行映射。区别在于,Xv6 只使用了三级页表,而 x64 则是使用四级页表,另外,二者的页表层级的命名也有区别,对 Xv6 来说,最高级的页表是 L3(其地址存放于寄存器 satp 中)。

每个 page table 含有 512 个 page table entry,而每个 page table entry 的大小是 8KB,因此一个 page table 占据的大小正好是 4KB,即一个 VP 的大小!

VMZ31LnYWRb8TUy

标志位可以说是顾名思义,除了这个 dirty?(留待之后处理)

Kernel address space

Xv6 中,每个进程都有属于自己的地址空间,以及一个全局唯一的描述内核地址空间的 page table,(kernel page table)。

内核内存布局:

QEMU 模拟了一台带 RAM(物理内存)的电脑,该 RAM 的起始地址是 $\text{0x80000000}$ ,结束地址至少是 $\text{0x86400000}$(该地址在 Xv6 中被定义为 PHYSTOP),这里的地址说的都是物理地址。

QEMU 会将设备接口以内存映射的控制寄存器暴露给系统软件,这些寄存器地址映射的内存都是在 $\text{0x80000000}$,即系统要访问这些设备,都是通过 $\text{0x80000000}$ 以下的物理地址直接访问,但通过这样的物理地址访问设备就不会经过 RAM 了。

内核空间的虚拟地址是直接映射到物理地址的,例如 KERNBASE=0x80000000,虚拟地址和物理地址都是这个值,可以理解为虚拟地址等于物理地址。

但是有几个内核虚拟地址不是直接映射的,如下图所示:

  • trampoline page(蹦床页面),它映射在虚拟地址空间的顶部,user page table 具有相同的映射,即不论 kernel page table 还是 user page table,trampoline page 的虚拟地址都是在虚拟地址空间的顶部;
  • kernel stack page,每个进程都有自己的 kernel stack,会映射到虚拟地址空间中比较高的那个 kernel stack,这样可以利用到 kernel stack 下方的那个 guard page。Guard page is invalid!PTE_V 没有设置)。因此,一旦 kernel stack 发生溢出,就会发生异常。

9iXhFnAN2DIozBx

trampoline page 是 r-x 的,kernel stack 是 rw- 的。

从图上来看,其实只有 kernel data 和 kernel text 是直接映射的。

Code: creating an address space

关于操作 page table 和地址空间的代码主要位于 kernel/vm.c 中。

通过函数 walk 找到虚拟地址对应的 PTE 以及最终的物理地址(相当于之前 csapp 的虚拟内存那一章提到的 page walk)。

标签:kernel,映射,虚拟地址,MIT,物理地址,页表,table,S081,page
From: https://www.cnblogs.com/zwyyy456/p/17523953.html

相关文章

  • MIT6.5840 lab2,3 记录
    参考链接课程地址如何Debug:没有它可怎么活,几万行的日志怎么看Students'GuidetoRaftraft算法可视化:直观展示raft可视化简单入门raft讲解视频:强烈推荐感想感觉理论+实践来学一个东西才学的深刻,特别是对于我这样对抽象理解不太行的,每次见识了一个算法或系统真正如何运行......
  • OutOfMemoryError: Java heap space/GC overhead limit exceeded 内存溢出问题排查
    一、背景我开发的给产线使用的工具时不时就无法登录,查看日志基本上都是内存溢出,查看实际内存基本上都占满了JVM设置的内存大小导致的现象就是SpringBoot项目无法登录,导致系统不可用。下面是我的java启动设置。javaw-Xmx6G-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPat......
  • 多个commit合并为一个
    在进行多个commit合并成一个博客编写的过程中,你可以使用以下代码示例作为参考:#合并多个commitgitrebase-iHEAD~N#N代表需要合并的commit数目,例如合并最近3个commit,N为3,也可以选择任意commit信息gitrebase-istartCommit[endCommit],默认endCommit是最新的commit,com......
  • 使用Redis时的vm.overcommit_memory内存分配控制
    最近在使用Redis的时候遇到了linux系统中的vm.overcommit_memory参数设置,对此不是很了解,于是研究了一下,有了本文。 ===================================== 一个尝试,如何在内存中申请空间:>>>100000*400000*8/1024/1024/1024298.0232238769531 实际代码:importnumpyas......
  • MIT 6.s081 实验环境搭建
    准备工作Linux系统,我是在实验室配的主机上装了DebianBookworm,然后mac通过ssh连接上去进行操作,宿舍里则是使用的wsl2,里面的发行版也是DebianBookworm。开始配置clone源码在~/Documents/code/mit目录下执行gitclonegit://g.csail.mit.edu/xv6-labs-2021,将源码cl......
  • 基本数据类型(primitive type)
    数据类型数据类型分为基本数据类型(primitivetype)和引用数据类型(referencetype)基本数据类型(primitivetype)数值类型整数类型浮点类型字符类型boolean类型引用数据类型(referencetype)类接口数组八大基本数据类型byte,占1个字节(1B),表示整数范围:-128--127sh......
  • git rebase合并多个commit
    一、为什么要合并commit?一般要merge到master的时候才会有这个要求,清晰明了的commit有利于团队维护。 二、什么是gitrebase?含义:rebase的意思是变基,‘re’前缀在英语里是‘再’的意思,'base':基础。命令:pick:正常选中squash:选中,会将当前commit与上一个commit合并fixup:与squ......
  • git撤销commit未push
    1.使用参数--mixed(默认参数),如gitreset--mixed<commitID>或gitreset<commitID>撤销gitcommit,撤销gitadd,保留编辑器改动代码2.使用参数--soft,如gitreset--soft<commitID>撤销git commit,不撤销gitadd,保留编辑器改动代码3.使用参数--hard,如gitreset--hard<comm......
  • .Net core 采集网页表格数据方法
    使用HtmlAgilityPack库来将HTML表格转换为DataTable。首先,确保已经安装了HtmlAgilityPack包。可以通过NuGet包管理器或者通过命令行安装。按照以下步骤将HTML表格转换为DataTable:导入命名空间:csharpCopyCodeusingHtmlAgilityPack;创建一个方法来进行转换:......
  • git commit
    #修改最近提交的commit信息gitcommit--amend--message="Vissim联仿代码入库"--author="duanyanling<[email protected]>"#仅修改message信息gitcommit--amend--message=""#仅修改author信息gitcommit--amend--author="duanyanl......