深入理解计算机系统第九章知识点总结

news2024/10/7 18:31:56

第九章

一些术语

  • PA(physical address):物理地址
  • VA(virtual address):虚拟地址
  • MMU(memory management unit):内存管理单元
  • VP(virtual page):虚拟页
  • PP(physical page):物理页/页帧
  • SRAM:表示位于CPU和主存之间的L1L2L3高速缓存
  • DRAM:表示虚拟内存系统的缓存,他在主存中缓存虚拟页
  • PTE(page table entry):页表条目,页表就是一个页表条目数组
  • VPO(virtual page offset):虚拟页面偏移量(每字节)
  • VPN(virtual page number):虚拟页号
  • VAS(virtual address sapce):虚拟地址空间
  • PAS(physical address space):物理地址空间
  • TLB(Transfer Lookaside buffer):快表、翻译后备缓冲器
  • TLBI:快表索引
  • TLBT:快表标记
  • PPO(physical page offset):物理页面偏移量
  • PPN(physical page number):物理页号
  • CO:缓冲块内的字节偏移量
  • CI:高速缓冲索引
  • CT:高速缓冲标记
  • PTBR(page table base register):页表基址寄存器
  • CR3(control register):控制寄存器(在四级页表中指向第一级页表的起始位置)
  • vm_area_structs:区域结构
  • 多级页表下的虚拟地址
    • VPN分为了四项
      • PGD(page global directory):全局页目录项
      • PUD(page upper directroy):上层页目录项
      • PMD(page middle directroy):中间页目录项
      • PTE(page table entry):页表项

虚拟地址空间与物理地址空间

  • 虚拟地址空间
    • 通常说的系统是64位的操作系统说的就是该虚拟地址空间大小为 2 64 2^{64} 264
  • 物理地址空间
    • 一般不要求是2的幂,计算机里面的C盘大小就是物理地址空间

虚拟页与物理页

  • 大小
    • 一般来说页的大小都一样
  • 两者的关系
    • 虚拟页的状态
      • 未分配的:未分配的页不占用任何磁盘空间
      • 缓存的:已经缓存在物理内存中的页
      • 未缓存的:已分配但未缓存在物理内存中的页

页表

  • 页表就是一个页表条目(PTE)数组,
    • 虚拟地址空间中的每个页在页表中一个固定偏移量处都有一个PTE
  • 页表条目
    • 页表条目是由一个有效位和一个n位地址字段组成的。
      • 有效位:表示该虚拟页是否被缓存在DRAM
      • 地址字段:表示DRAM相应物理页的起始位置

缺页

  • DRAM的不命中被称为缺页

虚拟内存作为内存管理的工具

  • 简化链接
    • 代码段都是从0x400000开始,不需要关注物理内存
  • 简化加载

  • 简化共享
    • 将不同进程中适当的虚拟页面映射到相同的物理页面
  • 简化内存分配

虚拟内存与物理内存的翻译细节

  • 虚拟内存被划分为:虚拟页号和虚拟页偏移量

    • 快表标记与索引包含在虚拟页号中

      假设快表是4路组相联,索引为2位,剩下的高位则是标记位

  • 物理内存被划分为:物理页号和物理页偏移量

多级页表(具有层次结构的页表)

  • 其是用来压缩页表的常用方法
    • 原理:如果一级页表中的一个PTE是空的,那么相应的二级页表将不会存在
  • 例子:四级页表
    • 前三级页表分的PTE分别指向下一级的页表的物理地址,第四级页表的PTE指向最终的物理页号

综合练习

如何将一个虚拟地址翻译为物理地址和访问缓存的

  • 需要知道的东西
    • 虚拟地址是多少位
      • 虚拟地址会划分为VPNVPO
    • 物理地址是多少位
      • 物理地址会划分为PPNPPO
    • 快表是多少路组相联的
      • 例如是4路,则虚拟地址VPN的低2位就是TLBI,剩余的高位就是TLBT
      • 快表的作用就是一个缓存,会存放之前cpu引用过的PTE副本(局部性原理)
    • L1cache的结构是如何的
      • 根据前面转换推出的PPN,然后根据第六章的知识就可以访问缓存中的数据了

例题:

已知:

  1. 内存按字节寻址
  2. 内存访问是针对1字节的字
  3. 虚拟地址是14位长
  4. 物理地址是12位长
  5. 页面大小是64字节
  6. TLB是四路组相联,总共有16个条目
  7. L1 d-cache是直接映射,行大小为4字节,总共有16个组

请添加图片描述

要求:写出CPU执行了一条读地址0x3d4处字节的加载指令发生了什么

处理已知信息

  1. 页面大小为64,则根据P568页图9-12可知虚拟内存与物理内存的划分

    V P O = P P O = log ⁡ 2 64 = 6 VPO = PPO = \log_264 = 6 VPO=PPO=log264=6

    剩下的高位就分别是VPNPPN

  2. TLB是四路组相联的,所以低2位属于TLBI快表组索引

    T L B I = log ⁡ 2 4 = 2 TLBI = \log_24 = 2 TLBI=log24=2

    所以高6 (14 - 6 - 2)位是TLBT快表行标记(用于锁定“”)

  3. L1 d-cache是直接映射,所以 E = 1 E = 1 E=1,行大小为4字节所以 B = 4 B = 4 B=4,总共有16个组,所以 S = 16 S = 16 S=16m则根据物理地址的位数求出为12

    所以该存储器的结构为 ( 16 , 1 , 4 , 12 ) (16, 1, 4, 12) (16,1,4,12)

解题步骤:

  1. 0x3d4展开将TLBT 、TLBI 、VPN 、VPO标记在对应位置上

请添加图片描述

  1. 先根据快表相关信息去快表中查看发现命中

请添加图片描述

  1. PPN(0x0D)VPO(0x14)结合得出物理地址0x354后划分物理地址然后访问缓冲

请添加图片描述

  1. 根据CT、CI、CO可以在告诉缓冲中找到目标值

请添加图片描述

缺页导致引发段错误的原因

  • 访问到了vm_area_structs未定义的位置

  • 一条试图对只读页面进行写操作

    运行在用户模式的进程试图从内核虚拟内存中读取字

正常缺页

经过上面两条信息后,内核知道了这个缺页是对合法的虚拟地址进行合法的操作造成的

缺页操作流程

  1. 判断虚拟地址 A 是否合法:将 A 和每个区域结构中的 vm_startvm_end 相比较。如果不合法会触发一个段错误。
  2. 判断试图进行的内存访问是否合法:检查进程是否有读、写、执行此区域内页面的权限。如果不合法会触发一个保护异常。
  3. 选择牺牲页面并进行替换,如果牺牲页面被修改过需要先写回。

内存映射

内存映射:Linux 通过将一个虚拟内存区域与一个磁盘上的对象关联起来,来初始化这个虚拟内存区域的内容。

虚拟内存区域可以映射到两种类型的对象:

  1. Linux 文件系统中的普通文件:一个区域可以映射到一个普通磁盘文件的连续部分,如一个可执行目标文件。如果区域比文件区要大,就用 0 填充剩下的部分。
  2. 匿名文件:一个区域可以映射到一个匿名文件,匿名文件由内核创建,包含的全是二进制零。

无论哪种情况,一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件(也叫交换空间)之间换来换去。

交换空间的大小限制着当前运行着的进程能够分配的虚拟页面的综述。

共享对象

  • 一个对象可以被映射到虚拟内存的一个区域,要么作为共享对象,要么作为私有对象

写时拷贝

  • 两个进程将一个私有对象映射到他们虚拟内存的不同区域,但是共享这个对象同一个物理副本。当有一个进程试图写私有区域内的某个页面,那么这个写操作就会触发一个保护故障。他会在物理内u才能中创建这个页面的一个新副本,更新页表条目指向这个新的副本,然后恢复这个页面的可写权限。

fork函数原理

fork是如何创建一个带有自己独立虚拟地址空间的新进程

  • 当fork被调用时,内核为新进程创建各种数据结构,并且为,他分配一个唯一的PID,为了给这个新进程创建虚拟内存,他创建了当前进程的mm_struct、区域结构和页表的原样副本。他将两个进程中的每个页面都标记为只读。并且将两个进程的每个区域结构vm_area_structs都标记为私有的写时复制

    fork在新进程中返回时,新进程现在的虚拟内存刚好和调用fork时存在的虚拟内存相同,当两个进程的任意一个后来进行写操作时就会触发写时复制机制创建新页面。

execve函数原理

例如执行execve("a.out", NULL, NULL);

  • 删除已存在的用户区域

    删除当前进程虚拟地址的用户部分中的已存在的区域结构

  • 映射私有区域

  • 映射共享区域

  • 设置程序计数器

使用mmap函数的用户级内存映射

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
  • 让内核将一个包含length字节的权限为prot且持有权限(私有还是共享)为flags的文件(描述符为fd)关联起来,相当于将磁盘上的一个文件映射到了进程虚拟地址上

malloc

返回值必须有对齐要求,这样就能存储任意数据类型的数据。但是这样会产生内部碎片

一些内存分配的实际问题

  • 空闲块组织:如何记录空闲块
  • 放置:如何选择一个合适的空闲块来防止一个新分配的块
  • 分割:分配好一个块后如何处理空闲块的剩余部分
  • 合并:如何处理一个刚刚被释放的块

堆块的格式

前提:块的大小必须双字对齐(8字节)

  • 32位(4字节)是块头部描述了块大小

    由于块大小总是8字节对齐,所以块大小的最后3位总是0,于是可以利用后三位来添加一些额外的信息,于是乎前29位用来描述这个块的大小(包括头部和所有填充)

  • 后面就是有效载荷和填充

    • 没有载荷时固定填充4字节与头部8字节对齐

放置已分配块的策略

  • 首次适配
  • 最佳适配
  • 下一次适配

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详解Spring事务

目录 1.声明式事务 1.1.概述 1.2.使用 1.2.1.建表 1.2.2.maven依赖 1.2.3.配置 1.2.4.业务 1.2.5.测试 2.事务的传播行为 1.声明式事务 1.1.概述 spring中事务分为两种: 1.编程式事务,通过写代码来实现,每一步。 2.声明式事务&am…

华为手表开发:WATCH 3 Pro(15)传感器订阅加速度计

华为手表开发:WATCH 3 Pro(15)传感器订阅加速度计初环境与设备加速度传感器介绍与说明鸿蒙开发文件夹:文件重点新增展示的文本标记index.hmlindex.cssindex.js初 希望能写一些简单的教程和案例分享给需要的人 鸿蒙可穿戴开发 环…

Elasticsearch:索引状态是红色还是黄色?为什么?

在我之前文章 “Elasticsearch:如何调试集群状态 - 定位错误信息” 中,我有详细介绍如何调试集群状态。在今天的文章中,我将详细介绍如何故障排除和修复索引状态。 Elasticsearch 是一个伟大而强大的系统,特别是创建一个可扩展性极…

C++、STL标准模板库和泛型编程 ——关联式容器 (侯捷)

C、STL标准模板库和泛型编程——关联式容器 (侯捷)( 持续更新!!!) 关联式容器rb_tree 容器set、multiset 容器map、multimap容器C、STL标准模板库和泛型编程——序列式容器 (侯捷&am…

go+vue——go入门

govue技术选择入坑理由需要搭建前后端,Java 0 基础 ,环境容易出现问题;GO上手快,问题少推荐:【七米】代码博客搭建Go语言开发环境下载 并 安装检查是否安装好?GOPROXY 非常重要(帮你下载国外、G…

分布式锁Redision

目录 1.ab工具(压测工具)的安装 2.前置 3.优化 3.1synchronized修饰代码方法/代码块 3.2分布式锁事务的解决方案 3.3Redis实现锁问题 3.3.1 set ex方式 3.3.2 set ex方式设置过期时间 3.3.3单redis结点的解决UUID和LUA脚本 3.3.4redission解决分布式锁 4.Redission解…

数据结构:顺序表

朋友们、伙计们,我们又见面了,本期来给大家解读一下数据结构方面有关顺序表的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C语言专栏:C语言:从入门…

阿里的Leader为什么牛逼?秘密都在“三板斧”里...

许多人都觉得,啊里出来的Leader,做事情都很有方法、有套路、有结果,秘密究竟在哪里?其实一个人的牛逼,首先是方法论的牛逼。本文就来聊聊,阿里Leader们都要学习的管理方法论,俗称阿里“三板斧”…

《MySQL系列-InnoDB引擎37》索引与算法-全文检索

全文检索 1 概述 对于B树的特点,可以通过索引字段的前缀进行查找。例如如下的查询方式是支持B树索引的,只要name字段添加了B树索引,就可以利用索引快速查找以XXX开头的名称。 select * from table where name like XXX%; 而如下这种情况不适合私有B索…

BUUCTF-sql注入联合查询的创建虚拟表-词频-steghide的使用

第七周第三次 目录 WEB [GXYCTF2019]BabySQli [GXYCTF2019]BabyUpload Crypto 世上无难事 old-fashion ​Misc 面具下的flag 九连环 WEB [GXYCTF2019]BabySQli 这是一道很新的题目 我们打开环境 发现登入注册界面 先看看源码有没有提示 发现有一个 php文件 进入…

Spark 对hadoopnamenode-log文件进行数据清洗并存入mysql数据库

一.查找需要清洗的文件 1.1查看hadoopnamenode-log文件位置 1.2 开启Hadoop集群和Hive元数据、Hive远程连接 具体如何开启可以看我之前的文章:(10条消息) SparkSQL-liunx系统Spark连接Hive_难以言喻wyy的博客-CSDN博客 1.3 将这个文件传入到hdfs中: hd…

OpenAI Translator | 基于ChatGPT API全局翻译润色解析及ORC上传图像翻译插件

简介 OpenAI Translator,一款基于 ChatGPT API 的划词翻译的浏览器插件和跨平台桌面端应用,使用 ChatGPT API 进行划词翻译和文本润色,借助了 ChatGPT 强大的翻译能力,帮助用户更流畅地阅读外语和编辑外语,允许跨 55 …

Qt音视频开发35-左右通道音量计算和音量不同范围值的转换

一、前言 视频文件一般会有两个声音通道及左右声道,值有时候一样有时候不一样,很多场景下我们需要对其分开计算不同的音量值,在QAudioFormat中可以获取具体有几个通道,如果是一个通道,则左右通道值设定一样&#xff0…

【时序数据库】时间序列数据和MongoDB第三部分-查询、分析和呈现时间序列数据...

在《时间序列数据和MongoDB:第1部分-简介》「时序数据库」时间序列数据与MongoDB:第一部分-简介中,我们回顾了理解数据库的查询访问模式需要询问的关键问题。在《时间序列数据和MongoDB:第2部分-模式设计最佳实践》「时序数据库」时序数据库和MongoDB第二…

Java实验课的学习笔记(二)类的简单使用

本文章就讲的是很基础的类的使用 重点大概就是类的构造函数以及一些很基础的东西。 实验内容是些老生常谈的东西,Complex类,在当初学C面向对象的时候也是这个样子展开的。 内容如以下: public class Complex {float real;float imag;public…

APK瘦身

先看下APK打包流程:APK打包流程_贺兰猪的博客-CSDN博客 知道了APK打包流程后想要瘦身,其实无非就是把整个APK的一些文件进行一个瘦身。 看下apk的这个文件。包括class、资源,资源生成arsc(资源映射表),manifest清单,…

快排(非递归)及计数排序算法

都学了递归版的快速排序为何还要再学非递归实现?由于在递归过程中,如果数据量过大,那么实现时容易导致栈溢出,虽然代码没有问题,但是就是会崩,因此要将其改为非递归来实现 文章目录一、快速排序&#xff08…

如何使用Mac远程控制Windows电脑?

在你开始之前,设置您要远程处理的 Windows 计算机。 先安装 Microsoft Remote Desktop。 您可以在“应用程序”文件夹中检查它。 如果在个人计算机上安装,请转到 Apple App Store 并下载 Microsoft Remote Desktop。 如果在 TXST 计算机上安装&#xff0…

【C语言】递归解决经典题目(汉诺塔问题、青蛙跳台阶问题)

简单不先于复杂,而是在复杂之后。 目录 1. 汉诺塔问题 1.1 简介及思路 1.2 代码实现 2. 青蛙跳台阶问题 2.1 简介及思路 2.2 代码实现 1. 汉诺塔问题 1.1 简介及思路 汉诺塔问题是一种经典的递归问题,起源于印度传说中的塔 of Brahma。问题描…

手把手教你学习IEC104协议和编程实现 十 故障事件与复位进程

故障事件 目的 在IEC104普遍应用之前,据我了解多个协议,再综合自动化协议中,有这么一个概念叫“事故追忆”,意思是当变电站出现事故的时候,不但要记录事故的时间,还需记录事故前后模拟量的数据,从而能从一定程度上分析事故产生的原因,这个模拟量就是和今天讲解的故障…