6.S081笔记

2023-11-04

Lec 01简单介绍

XV6(OS)运行在一个RISC-V微处理器上,我们用QEMU模拟RISC-V,从而在一个QEMU模拟器上运行XV6。

Lec 03

硬件对强隔离的支持

两种方式实现了隔离性:

  1. 内核态、用户态的切换(user/kernel mode)
  2. 虚拟内存

请添加图片描述
我们可以认为user/kernel mode是分隔用户空间和内核空间的边界,用户空间运行的程序运行在user mode,内核空间的程序运行在kernel mode。操作系统位于内核空间。

RISC-V中,用ECALL来让应用程序可以将控制权转移给内核(用户态转内核态)。具体来说:
  ECALL接收一个数字参数,当一个用户程序想要将程序执行的控制权转移到内核,它只需要执行ECALL指令,并传入一个数字。这里的数字参数代表了应用程序想要调用的System Call。

假设我现在要执行另一个系统调用write,write系统调用不能直接调用内核中的write代码,而是由封装好的系统调用函数执行ECALL指令。所以write函数实际上调用的是ECALL指令,指令的参数是代表了write系统调用的数字。之后控制权到了syscall函数,syscall会实际调用write系统调用。

宏内核与微内核

宏内核与微内核的区别:是否将整个OS代码都运行在内核态中,如果是的话就是宏内核。

宏内核代表:Linux
微内核代表:Windows

宏内核的特点:

  • 坏处:代码量越大,出现漏洞的概率就越大,就越不安全。一旦内核态出现BUG,就容易被攻击
  • 好处:因为这些子模块(文件系统、虚拟内存)现在都位于同一个程序中,它们可以紧密的集成在一起,这样的集成提供很好的性能

微内核的特点:

  • 好处:不用说,就是安全
  • 坏处:举个例子:比如说某个程序需要和文件系统交互,需要先通过内核IPC(进程间通信)先通知内核(内核态),内核再把信息转发给文件系统(用户态)。文件系统再将结果返回给内核(内核态),由内核态转发给程序(用户态)。很明显,微内核会导致在用户态和内核态反复跳转,性能很差

Lec 04 虚拟内存

虚拟内存:

  • 存在虚拟地址空间到物理地址空间的映射
  • 实现隔离性

1. 地址空间

为了防止不同程序之间不会互相影响(隔离性),我们应该给不同程序专属的地址空间。

所以,当我们运行cat时,它的地址空间从0到某个地址结束。当我们运行Shell时,它的地址也从0开始到某个地址结束。内核的地址空间也从0开始到某个地址结束。

在这里插入图片描述
如果cat程序想要向地址1000写入数据,那么cat只会向它自己的地址1000,而不是Shell的地址1000写入数据。所以,基本上来说,每个程序都运行在自己的地址空间,并且这些地址空间彼此之间相互独立。在这种不同地址空间的概念中,cat程序甚至都不具备引用属于Shell的内存地址的能力。这种方式为我们提供了强隔离性,cat现在不能引用任何不属于自己的内存。

虚拟内存地址可以大于物理内存。

在XV6中,kalloc.c保存了空余内存块:
kmem这个结构体将所有空闲的内存块串成一个链表来管理,每个节点都指向一个空闲内存块的开头地址。链表的头指针为freelist

1.1 页表

我们如何能够实现地址空间呢?或者说如何在一个物理内存上,创建不同的地址空间?使用页表。页表是在硬件中通过处理器和内存管理单元(Memory Management Unit)实现。

虚拟地址如何转换为物理地址?
  内存管理单元(MMU)会将虚拟地址翻译成物理地址。之后这个物理地址会被用来索引物理内存,并从物理内存加载,或者向物理内存存储数据。

为了能够完成虚拟内存地址到物理内存地址的翻译,MMU会有一个表单(页表),表单中,一边是虚拟内存地址,另一边是物理内存地址(以4KB为一个单位,页长)。举个例子,虚拟内存地址0x1000对应了一个我随口说的物理内存地址0xFFF0。这样的表单可以非常灵活。

通常来说,内存地址对应关系的表单(页表)也保存在内存中。所以CPU中需要有一些寄存器用来存放页表在物理内存中的地址。 现在,在内存的某个位置保存了地址关系表单,我们假设这个位置的物理内存地址是0x10。那么在RISC-V上一个叫做SATP的寄存器会保存地址0x10。

这样,CPU就可以告诉MMU,可以从哪找到将虚拟内存地址翻译成物理内存地址的表单。

所以,总结一下:MMU不保存页表,他只是从内存中读取页表,然后完成翻译

注意,每个进程都有自己的独立页表,并且这个页表定义了应用程序的地址空间。所以当操作系统将CPU从一个应用程序切换到另一个应用程序时,同时也需要切换SATP寄存器中的内容,从而指向新的进程保存在物理内存中的地址对应页表。

实际上,实际情况不可能是一个虚拟内存地址对应page table中的一个条目。接下来我将分两步介绍RISC-V中是如何工作的。:

第一步:不要为每个地址创建一条表单条目,而是为每一页创建一条表单条目,所以每一次地址翻译都是针对一个page。而RISC-V中,一个page是4KB(页长)。

第二步:现在,内存地址的翻译方式略微的不同了。首先对于虚拟内存地址,我们将它划分为两个部分,index和offset,index用来查找page,offset对应的是一个page中的哪个字节。
  
当MMU在做地址翻译的时候,通过读取虚拟内存地址中的index可以知道物理内存中的page号。之后虚拟内存地址中的offset指向了page中的4096个字节中的某一个,假设offset是12,那么page中的第12个字节被使用了。将offset加上page的起始地址,就可以得到物理内存地址。

有关RISC-V的一件有意思的事情是,虚拟内存地址都是64bit,这也说的通,因为RISC-V的寄存器是64bit的。但是实际上,在我们使用的RSIC-V处理器上,并不是所有的64bit都被使用了,也就是说高25bit并没有被使用。这样的结果是限制了虚拟内存地址的数量,虚拟内存地址的数量现在只有2^39个,大概是512GB。

在剩下的39bit中,有27bit被用来当做index12bit被用来当做offset。offset必须是12bit,因为对应了一个page的4096个字节

一个目录项(PTE)的大小为64比特(位)(因为OS为64位),也就是8个字节。所以一个4k页的页表正好对应512个PTE。采用多级页表结构的最重要的原因就是节约因为存储页表而耗费的内存页。

2. 支持虚拟内存的硬件

3. 代码展示虚拟内存

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

6.S081笔记 的相关文章

  • 深度学习输入输出特征图尺寸计算&&卷积的填充方式

    1 卷积层输入特征图 input feature map 的尺寸为 H input W input C input 依次为输入特征图的高 宽 通道数 2 输出通道数K 即卷积核个数 正方形卷积核的边长为F 步幅 stride 为S 补零的行
  • 使用IntelliJ IDEA 配置Maven(入门)

    http blog csdn net qq 32588349 article details 51461182
  • 利用MATLAB求均值、方差和标准差

    1 均值 数学定义 Matlab函数 mean 如果X是一个矩阵 则其均值是一个向量组 mean X 1 为列向量的均值 mean X 2 为行向量的均值 若要求整个矩阵的均值 则为mean mean X 或者mean2 X 2 方差 数学
  • 最适合小白的matlab教程系列_进阶系列一

    目录 二维平面图形 plot函数 我们更少不了图形的修饰 图形窗口分割 几个图 plot3函数 绘制三维曲面的函数 标准三维曲面 三维图形视点处理 二维平面图形 plot函数 命令格式 plot x y x位横坐标值 y为纵坐标值 plot
  • 密度聚类算法(DBSCAN)实验案例

    密度聚类算法 DBSCAN 实验案例 描述 DBSCAN是一种强大的基于密度的聚类算法 从直观效果上看 DBSCAN算法可以找到样本点的全部密集区域 并把这些密集区域当做一个一个的聚类簇 DBSCAN的一个巨大优势是可以对任意形状的数据集进

随机推荐

  • 面向对象编程类的内聚性

    高内聚 低耦合是软件设计中非常关键的概念 在面向对象程序设计中类的划分时 类的内聚性越高 其封装性越好 越容易复用 以下在类划分时关于内聚性的问题 静态类的设计 在软件设计中 我们经常会将一些通用的方法封装到一个类中 这种类只包含方法 没有
  • algorithm.h C艹

    include
  • MySQL数据库基础表格——增删改查(上)

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 树高千尺 落叶归根人生不易 人间真情 前言 不要太在乎别人对你的评价 做好自己个人 干好自己的事 走好自己的
  • 对比APK的数字签名是否一致

    目前在做一个应用商店的项目 有一个场景 比如手机上已经安装了一个被篡改过的QQ应用 通过本应用商店下载了一个官方版的QQ应用 在替换安装时提示签名不一致 安装失败 那么这时需要卸载掉已安装的QQ 再安装官方版QQ 所以需要验证一下已安装QQ
  • 服务器数据恢复-ESX SERVER常见故障的数据恢复的可能性分析

    ESX SERVER常见故障表现 1 因光纤存储设备连接至非ESX环境 共享未互斥 对存储进行的改写操作 如 重装系统 WINDOWS初始化 格式化等 导致存储结构损坏 2 卷升级 变更时分区表或VMFS卷结构异常 3 VMFS存储中VMD
  • URL下载网络资源

    URL 统一资源定位符 定位互联网上的某一个资源
  • $AT2663$ $Namori$ $Grundy$

    题目链接戳这里 简化题意 题意 有一个弱联通的有向图 含有 个结点和 条边 试问是否存在方案 赋给每个结点一个自然数权值 满足对于所有结点 mex in 一个集合的 mex 是没有在这个集合中出现的最小自然数 显然是个基环树 先考虑在树上的
  • python爬取百度百科

    来源于imooc教程实例 课程地址http www imooc com learn 563 以下是自己经过每一步分析 最后成功完成 代码模块化结构分明 不过自己一开始分析还是有点晕晕的 毕竟还不太习惯 以后多练习吧 每一份的收获都来之不易
  • jqGrid学习总结_5 使用formatter

    1 formatter与unformat官网 http www trirand com jqgridwiki doku php id wiki custom formatter formatter functionFormatter cel
  • IDEA设置自动生成类和方法注释

    以IDEA2020 3版本进行说明 一 设置创建类时生成的注释 打开 File gt settings gt Editor gt File and Code Templates 或者在搜索框搜索File and Code Templates
  • 关于antd中popover气泡卡片deep修改样式不生效问题

    今儿写代码的时候遇到的一个问题 原是因为使用气泡组件出现的定位位置不对 查出是因为全局上写了一个zoom属性 但是这个zoom属性因为在其他组件上使用了不能动 所以考虑修改气泡组件的样式来自定义位置 利用deep修改样式后发现样式不生效 后
  • 使用pandas to_sql方法进行数据整合和清洗

    使用pandas to sql方法进行数据整合和清洗 在数据科学和数据分析领域 数据集的整合和清洗是非常重要的 而pandas是一个强大的数据处理库 它提供了to sql 方法 可以将Dataframe对象保存到多种不同类型的SQL数据库中
  • Points Within

    http acm zju edu cn onlinejudge showProblem do problemId 81 Statement of the Problem Several drawing applications allow
  • 有源滤波器快速使用设计和精确设计

    有源滤波器的快速实用设计 pdf https max book118 com html 2019 0114 8013057114002001 shtm 有源滤波器精确设计手册 pdf https max book118 com html 2
  • NAT功能与分类

    NAT的分类 比较早的有STUN RFC3489 定义的四种类型 Full Cone A full cone NAT is one where all requests from the same internal IP address a
  • spring boot打jar包、war包的区别

    maven打包 项目的打包类型 pom jar war packing默认是jar类型
  • Jenkins (一)

    Jenkins 一 Docker Jenkins 部署 一 安装 jenkins mkdir p home tester data docker jenkins vim jenkins lts jdk11 sh jenkins lts jd
  • 【大数据】Hadoop实验报告

    文章目录 实验一 熟悉常用的Linux操作和Hadoop操作 1 实验目的 2 实验平台 3 实验内容和要求 实验二 熟悉常用的HDFS操作 1 实验目的 2 实验平台 3 实验步骤 实验三 熟悉常用的HBase操作 1 实验目的 2 实验
  • c语言里如何倒序输出字符,倒序输出字符 C语言

    匿名用户 1级 2010 11 26 回答 include include void main char string1 200 用于存放输入的字符串 char string2 200 用于存放倒序后的字符串 int invertion c
  • 6.S081笔记

    Lec 01简单介绍 XV6 OS 运行在一个RISC V微处理器上 我们用QEMU模拟RISC V 从而在一个QEMU模拟器上运行XV6 Lec 03 硬件对强隔离的支持 两种方式实现了隔离性 内核态 用户态的切换 user kernel