首页 > 系统相关 >Lec3 Lec4: 虚拟内存和RISC-V寄存器

Lec3 Lec4: 虚拟内存和RISC-V寄存器

时间:2024-03-29 15:58:48浏览次数:18  
标签:虚拟地址 RISC Lec4 物理地址 地址 内存 寄存器 虚拟内存

虚拟内存

使用虚拟内存主要为了实现隔离
内存隔离,所有程序指令存放在一个物理内存上,如果一个指令的操作位刚好是另一个指令的地址,那么会造成指令的丢失
为了解决这个问题使用地址空间

地址空间

为每一个指令程序分配自己的地址空间,每个指令程序只能在自己的地址空间上操作。我们需要做的就是复用不同的地址空间在一个物理内存

页表

一个页的大小是4096字节
实现虚拟内存到物理内存的映射
通过内存管理单元将虚拟地址转换为物理内存地址

CPU中具有一个寄存器satp来存放物理内存的地址,依次来告诉内存管理单元如何去寻找物理内存

每个应用进程都有具有一个映射关系,当cpu切换进程时,satp存储的值也会发生变化,使得不同进程即使虚拟地址相同,寻找到的物理内存也是不一样的。
satp的改变是由内核特权指令执行的。

映射方式

理论上是由\(2^{27}\)个页表条目PTE组成的,每个PTE中由中间44位PPN和后10位标志位控制物理地址的实际地址,可以用8B大小的uint64类型来存储,一般中间44位就是真实物理地址。偏移量由虚拟地址的后12位给出,大小为4KB
实际上页表以三级的树型结构存储在物理内存中,每棵树都是一个4096byte的页表页,包含512个PTE,该PTE对应下一棵的根物理地址,最后一棵树搜索到的PTE就是真实物理地址,而在每棵树的PTE就是通过存在虚拟地址中的中间27位均分为3个9位来进行偏移求解的

对于一个64位机器,如果是一一映射那么需要大小将是\(2^{64}\)其将占用全部内存
正确实现方式是

  1. 为每个页4KB实现映射,而不是每个地址,所以现在的一个虚拟地址存储为一个基准+偏移量
    由于在RISV中高25位空间都不会用到,所以虚拟内存的大小被限制在\(2^{39}\),前27位用来定义索引,然后偏移量写在低12位,由于一个页的大小就是4096byte
    物理内存实际上是56位,56则是根据硬件设计的,前44位描述的是物理内存的索引,后12位对应偏移
  2. 映射方式:虚拟内存的27位会被分成3段,每段为虚拟地址中的9Bit位组成,每段为一层,用于对应寻找物理内存地址,第一段就是顶层目录,其大小就是4096byte,对于其中的每个条目大小是64bits,也就是8byte所以一个目录可以存放512个条目即512个物理内存地址,通过satp寄存器的内容寻找到存放在第一个目录中的位置中数据,以此来寻找第二层目录中的位置...

    对于每个虚拟内存地址,其中间27位被分成3段,从第一段开始表示第一级目录在satp对应的物理内存下的偏移,为satp会寻找到顶级目录的物理地址索引,然后虚拟地址中的第一段9位会提供一个偏移,找到第二段物理地址的位置,第二段9位会提供第二个偏移...
    PPN存放的是物理地址,而不是虚拟地址,我们需要通过该地址寻找下一个物理地址,最终找到的地址就是我们这个虚拟内存对应的物理内存地址44位,比如使用到3个目录,那么最后一个目录寻找到的ppn就是最终物理内存地址,而偏移是原始虚拟地址的偏移。
    可以发现,对于每次转换,总需要对内存进行三次访问。实际上对于处理器来所,其拥有一个转换后备缓冲器(TLB)用来存储最近使用的转换方式,它只是保存了页表条目或者PTE条目的缓存,即一种映射方式{虚拟地址,对应的物理地址}。当处理器切换了新的进程,具有新的页表目录和satp寄存器内容,那么TLB中的内容就需要得到更新(sfence_vma)

xv6中的虚拟内存

xv6会为每个进程维护一个页表,采用直接映射的方式,即物理地址对应的就是虚拟地址(从0x80000000->0x86400000)
对于内核栈,每个进程都拥有自己的内核栈,其存储在进程虚拟地址中较高的位置,其下方有一个没有映射关系的页表,即当发射栈溢出时,会先访问这个没有映射关系的页表,导致出错,从而防止对内核栈的覆盖。当然内核栈也会在0x80000000->0x86400000之间有一个映射关系(即物理地址可以有多次映射到虚拟地址上)。
即一个进程拥有一个页表,进程中虚拟地址空间(0x80000000->0x86400000)每一个地址中间通过多级页表结构映射到物理内存中。

寄存器

寄存器为CPU的一部分,一些基础运算通常是在寄存器上完成的,一般通过其ABIName来调用它,比如在trace和sysinfo实验中对于trapframe中的a0和a7就是x10和x17的ABIName

对于函数的参数存放在寄存器a0-a7中,如果函数参数超过8个才会存放到内存中,同时a0和a1还会存放函数的返回值,但一般会首先存放在a0中,所以对于系统调用的trace中我们使用a0和a7来进行对mask的赋值和判断
其从保存权限(Saver)来说可以分为两类Caller和Callee,Caller是指在函数调用期间可以更改的值,而Callee属性下的寄存器会在函数调用过程中得到保留

一个函数调用在栈中由一个栈帧保存,其中最重要的两个值为该函数的返回值和前一个栈帧的起始位置(fp指针控制),调用函数就是通过fp指针的移动到对应的栈帧然后进行调用,一般在当前栈帧的顶部,栈中还有一个sp指针用来控制当前栈的使用大小,在栈的最底部,栈的存储是从高地址向低地址存储的,也就是说第一个函数存放在高地址,然后第二个函数将存放在sp-num的位置

函数序言

对于一个函数在内部调用了其他一个函数,汇编后会在调用函数之前形成函数序言,在函数尾部形成函数尾部。主要作用是为了对返回地址进行保存,因为ra寄存器是caller类型,当内部进行函数调用后,内部函数会把ra寄存器覆盖,最后的返回地址仍然是内部函数的ra,导致死循环。所以需要对ra存放在callee类型的寄存器中,然后在函数调用结束后恢复到ra

标签:虚拟地址,RISC,Lec4,物理地址,地址,内存,寄存器,虚拟内存
From: https://www.cnblogs.com/XTG111/p/18103986

相关文章

  • 批处理脚本来将 Windows 10 的虚拟内存设置为自动管理所有驱动器的分页文件大小
    批处理脚本来将Windows10的虚拟内存设置为自动管理所有驱动器的分页文件大小:CopyCode@echooffREM将所有驱动器的分页文件大小设置为自动管理REM禁用虚拟内存wmiccomputersystemwherename="%computername%"setAutomaticManagedPagefile=Falsewmicpagefilesetw......
  • RISC-V CPU管道模拟
    RISC-VCPU管道模拟1.简介RISC-V是源自伯克利的开源架构和指令集标准。该项目要求您基于标准的五阶段管道实现RISC-VCPU管道模拟器。您需要从RISC-V规范2.2中指定的RV32I指令设置中实现指令的子集。实施完整的CPU模拟器可以有效地行使系统编程功能,并加深对与建筑有关的知识......
  • RISC-V SV39地址映射方式
    SV39地址映射PTESV39是RV64支持的虚拟地址转换方式,其虚拟地址是39bit,可以映射的物理地址是56bit,页表entry格式如下,512GB地址空间被划分为512个1GB的吉页,每个吉页被进一步划分为512个2MB的兆页,每个兆页被进一步划分为512个4KB的基页:  satpSV39页表的基地址由satp(Supervisor......
  • Book-Riscv-XV6-Chap1
    操作系统接口–阅读xv6-riscv-bookXv6的时钟周期:定时器芯片两次中断之间的时间xv6作为一个简单的操作系统,利用一个“内核kernel”向其他运行中的程序提供服务的特殊程序,这个内核相当于连接了硬件和运行程序。每一个正在运行的程序可以称为进程,都拥有子集的包含指令、数据、......
  • 云服务centos7 增加虚拟内存
    1、查看磁盘使用情况free-h而Mem就表示购买阿里云时候的内存,我们能够看到只有3.9G,并且已经使用了3.7G。 2、添加Swap分区使用dd命令创建名为swapfile的swap交换文件(文件名和目录任意):ddif=/dev/zeroof=/var/swapfilebs=1024count=4194304dev/zero是Linux的一种特殊字......
  • 服务器分配虚拟内存
    1.打开终端,输入命令sudoswapon-s查看当前交换分区情况。2.如果没有交换分区,则需要创建一个交换分区。可以通过GParted等工具进行创建,也可以通过命令sudoddif=/dev/zeroof=/swapfilebs=1Mcount=2048创建一个大小为2GB的交换文件。3.设置交换文件权限:sudochmod600/sw......
  • riscv linker relaxations 是什么
    什么是linkerrelaxations由于链接时携带一些符号地址信息,可以执行一些编译时难以或者不大可能实现的优化。LinkerRelaxtion与传统编译时期的优化是不一样的,此优化发生在链接时。通常情况下,在链接时,改变代码的执行序列是有风险的,因为语义信息此时会丢失,链接器看到也仅是字节流......
  • 高性能、低功耗 基于8位AVR®RISC的ATMEGA328PB-MUR、ATMEGA328PB-ANR、ATMEGA328PB-A
    1、说明ATMEGA328PB是一款高性能、低功耗、基于8位AVR®RISC的微控制器,集成了具有读写功能的64kBISP闪存、2kBEEPROM、4kBSRAM、27条通用I/O线、32个通用工作寄存器、两个具有比较模式和PWM的灵活定时器/计数器、一个具有硬件Lin的UART、一个具有两个差分可编程增益输入级......
  • 磁盘调度算法、虚拟内存、抖动(颠簸)、堆栈访问速度、内存分配、内存交换、编码(ASCII、U
    常见的几种磁盘调度算法:读写一个磁盘块的时间的影响因素有:......
  • 虚拟技术-时分复用、空分复用、进程状态切换、程序生成过程、进程同步、虚拟内存
    虚拟技术把一个物理实体转换为多个逻辑实体。主要有两种虚拟技术:时(时间)分复用技术   空(空间)分复用技术多进程与多线程:多个进程能在同一个处理器上并发执行使用了 时分复用技术,每个进程轮流占用处理器,每次只执行一小个时间片并快速切换。虚拟内存使用了空分复用......