虚拟内存初探CSAPP

news2025/8/3 7:34:36

VM  as a tool for caching

CMU213-CSAPP-Virtual-Memory-Concepts | GreenHatHGのBlog

理解这个概念,就是说,VM是看作是独立与CPU和主存之外的disk,然后主存看成是这个虚拟地址数列的cache (DRAM就是物理的主存)

重新用自己的话说一下概念,虚拟内存是长度为N的连续数组,保存在disk上

数组上的内容on disk 缓存在 physical memory (DRAM cache)上

那么disk和主存之间的传输单元是 一块一块的,虚拟内存叫虚拟页virtual page, 物理内存叫physical page. 

虚拟内存有三种情况

unallocated (不占用disk的空间)

cached

uncached

 概念

页表page table:就是一个字典,key是 PTE (page table entry, 就是虚拟地址页的index), value是物理地址页的index

CPU执行move, call, jump. ret 任何控制转移指令,都会生成一个虚拟地址,MMU内存管理单元会在页表中查找

页命中page hit: 指的是VM word在DRAM cahe hit

缺页/页缺失page fault: 指的是VM word不在物理内存上DRAM cache miss

遇到这种情况,硬件会触发异常(exception),然后操作系统 会转移控制权到内核的page fault 处理的代码块,从物理内存选择一个page被替换,这个叫做select a victim to be evicted, 这个被替换的叫做牺牲页

disk和内存传递块的过程 交换(swapping)或者页面调度(paging) 

页面调入DRAM

页面调出DRAM

当有不命中发生时,才换入页面的策略叫做 按需页面调度(demanding paging)

CSAPP解释了,当时虚拟内存的概念提出来,高速缓存SRAM还没被提出来,因此很多概念是相似接近的。

当C语言执行malloc,实际发生了什么?实际上是在页表上,找到未分配的条目(页 的index),然后修改PTE5的状态由 unallocated改为uncached, 并没有搬到主存上

一般来说,程序具有良好的局部性,这套虚拟内存机制都可以工作得很好,但一旦你的工作需要的数据量大于内存可以放下的大小,就会出现抖动,不断驱逐的情况 thrashing 抖动,页面将不断地换进换出。

每个process都有自己的虚拟内存空间,简化了内存管理

内存分配有一套mapping方案,每个virtual page 可以map到物理页上

每个进程都有一个非常相似的虚拟地址空间,code和data都从相同的位置开始,

在物理内存的同一位置可以share给不同的进程,这就是动态共享库的原理,libc.so只需要在物理内存加载一次

理解虚拟内存后,回过头来看看链接和加载

- 链接:共享库很好理解,不同的进程有不同的虚拟地址空间,可以映射到通过物理地址,这就是共享啦

- 加载:假设我们要加载一个prog, 这个prog有代码和数据(.text .data) 加载到一个进程中。实际操作是这样的,操作系统的加载器未.text 和.data分配了各自的虚拟页(virtual page),把它们标记未无效的(就是未被缓存的 uncached), 因此,实际上加载器 不从磁盘到实际内存复制认为你和数据,在每个页被初次使用时,这个CPU指令用到这个内存位置,虚拟内存会自动按需自动调入相应的数据页.

Loading: execve allocate virtual page for .text and .data section, and create PTE maked as invalid. The .text and .data sections are copied page by page, on the demand of virtual memory system

对内存的保护,就是我们要访问一个地址,通过MMU查找虚拟地址的PTE,设置3个许可位,SUP内核(超级用户)才可以访问页,读写权限等,如果违反,CPU会触发保护故障,将控制转移传递给内存的异常处理程序,linux shell中,将这种异常报告称为段错误 segmentation fault

在 x86-64 系统上,指针和地址都是 64 位的,但是虚拟地址空间则是 48 位的,超过 48 位的 bit 要么全是 0 要么全是 1,这是 intel 制定的规则,高位全为 1 的地址为内核保留(地址指向内核中的代码或者数据),高位全为 0 的地址为用户代码保留。

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

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

相关文章

大规模异构图召回在美团到店推荐广告的应用

总第530篇2022年 第047篇美团到店推荐广告团队在图神经网络的长期落地实践中,思考分析了场景的特点与挑战,针对性地进行了模型设计,并通过大规模训练工具及线上部署优化多次成功落地,带来了线上收入提升。本文主要介绍了大规模图召…

nginx--源码分析 array(实现动态数组)

1.基本数据结构 typedef struct {void *elts;ngx_uint_t nelts;size_t size;ngx_uint_t nalloc;ngx_pool_t *pool; } ngx_array_t;结构成员定义 1.void* elts :数组的内存位置, 即数组首地址 采用void* 近似使用模板技术,可以通过类…

npm配置taobao镜像及nrm快速换源工具介绍

文章目录npm配置淘宝镜像1 为什么默认源下载很慢?2 淘宝npm镜像服务器3 切换npm的下包镜像源4 nrmnpm配置淘宝镜像 1 为什么默认源下载很慢? 在使用npm下包的时候,默认从国外的https://registry.npmjs.orgl服务器进行下载,此时&…

linux的重定向与xshell原理

文章目录一、重定向1.输出重定向&#xff1a;>1.写入指定文件2. 覆盖写2.追加重定向 &#xff1a;>>3.输出重定向&#xff1a;<1.键盘显示2.文件显示4.重定向的一些认知误区1. test.c只显示错误的2. msg.c只显示正确的3.分析4.显示出正确的二 、xshell命令及原理1.…

【Python】环境搭建详细过程

前言 要想能够进行 Python 开发, 就需要搭建好 Python 的环境。 需要安装的环境主要是两个部分: 运行环境: Python开发环境: PyCharm 安装Python 1、找到官方网站 2、找到下载页面 点击后开始下载&#xff0c;下载完成后会出现exe的安装程序 3、双击安装包 注意&#xff1a…

scala语法(一)(有java基础速学)

在拥有java基础上学习scala&#xff0c;注意以下几点 1. 变量声明 var | val 变量名 [: 变量类型] 变量值 val name: String "nico" 声明变量时&#xff0c;类型可以省略&#xff08;就是叫 类型推断&#xff09; val name "nico"类型确定后&#xff…

下载MySQL驱动包,并导进idea

操作MySQL就需要下载Mysq 驱动包 Mysql驱动包可以去“中央仓库”下载&#xff1b; 打开“中央仓库”&#xff0c;可能会等待验证是否为人机&#xff1a; 进行搜索&#xff0c;找到【MySQL Connector Java】 进行下载 往下话&#xff0c;找到跟自己MySQL对应的版本号&#xf…

Linux基本指令(二)

这章我们将继续介绍一些Linux常见的指令. 目录 more指令 less指令&#xff08;重要&#xff09; head指令 tail指令 时间相关的指令 cal指令 find指令 &#xff08;很重要&#xff09; which指令 alias指令 grep指令 xargs指令 zip/unzip指令 tar指令&#xff08;重要&#xff…

使用json、yaml、toml作为配置文件,你知道他们的区别吗

前言 配置文件&#xff0c;不言而喻&#xff0c;主要是我们进行项目和工程配置的文件。 如果是站在前端角度说的话&#xff0c;我们最常接触的就是 json以及 js类型的文件&#xff0c;这种形式的配置写法对前端非常友好&#xff0c;因为都是我们熟悉的 JS 对象结构&#xff0…

计算机专业毕业设计项目,如何去做?一位大龄过期“初级”程序员来讲讲

首先自我介绍一下&#xff0c;作为一名超过35岁以上初级程序员&#xff0c;请看仔细&#xff0c;初级程序员。从业5年&#xff0c;涉及的领域web站全栈&#xff0c;后端使用语言Java。 一、主题和程序语言的选择 我记得上个小伙伴跟我说过&#xff0c;他们的大学是每年的4月份…

pytest -- Allure报告

执行和生成报告&#xff1a; 1&#xff09;在main文件中加入如下代码&#xff1a; 1&#xff09;在main文件中加入如下代码&#xff1a; if __name__ __main__:# 指定临时json文件生成位置 pytest.main(["./case/test_visit_url_screenshot.py", …

好用的电容笔有哪些?2022年电容笔十大品牌排行榜

每一件产品都有其独特的含义、存在和作用。现在ipad的热度和ipad的影响力都在逐渐提升&#xff0c;使得ipad的用户也在不断增长&#xff0c;那么想要提升ipad的性能&#xff0c;就必须要有一款适合ipad的电容笔。所以&#xff0c;应该选用什么牌子的电容笔&#xff1f;我会给大…

完美支持--WIN11--Crack--LightningChart-10.3.2.2

实例探究--LightningChart,Crack完美支持Windows11 破解版了解LightningChart的客户如何在他们的应用程序中实施 LightningChart &#xff0c;成为现实生活中的成功案例。---内容摘自官网&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; Lightnin…

一文让你了解数据采集

随着云计算、大数据、人工智能的发展&#xff0c;数据采集作为数据的重要手段&#xff0c;成为广大企业的迫切需求。 所谓“得数据者&#xff0c;得人工智能”&#xff0c;如今人工智能早已在我们的生活中屡见不鲜。如“人脸识别”、“语音唤醒音响”等都属于人工智能的范畴。…

网站劫持常见方法

前言 本文主要是对常见的网站劫持方法进行总结学习&#xff0c;通过提前学习了解&#xff0c;不至于在遇到实际项目时手足无措。 网站劫持是黑帽SEO中的一种方式&#xff0c;可以通过入侵服务器获得权限后&#xff0c;对前端JS、后端脚本文件以及中间件进行设置&#xff0c;从…

【微信小程序系列:五】小程序适老化自动适配工具miniprogram-elder-transform---微信老年关怀模式下小程序字体适配微信字体

1.先言 这个工具我网上基本找不到任何一篇文章说这个miniprogram-elder-transform的使用的&#xff0c;&#xff0c;既然没有&#xff0c;那咱就自己写第一篇~ Android字体大小标准默认16px&#xff0c;iOS字体大小标准默认17px。 个人觉得&#xff0c;微信用户设置字体大小超…

新手必看 电商商家一般不会分享的TikTok涨粉秘笈

想要实现TikTok营销变现增长&#xff0c;除了TikTok选品&#xff0c;还要学会TikTok营销。而对于刚刚起步的TikTok电商商家来说&#xff0c;涨粉就是第一烦恼了&#xff0c;今天就来说说关于TikTok涨粉这些事&#xff01;1、确定目标市场 首先&#xff0c;调研并确定所在行业与…

电脑c盘满了怎么清理,快速清理,用这5招

​新买的电脑没用多久&#xff0c;突然发现系统提示磁盘空间不足。点击一看&#xff0c;电脑c盘空间已经爆满变红。当出现这种情况时&#xff0c;很多电脑的运行速度会大大降低&#xff0c;甚至导致部分应用无法正常运行。那么电脑c盘满了怎么清理&#xff1f;如何释放电脑c盘空…

OpenGL 阴影

目录 一.OpenGL 阴影 1.IOS Object-C 版本1.Windows OpenGL ES 版本2.Windows OpenGL 版本 二.OpenGL 阴影 GLSL Shader三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >&…

Vuex 笔记

文章目录1 Vuex 简介2 Vuex 用法2.1 安装 vuex2.2 修改 main.js,2.3 使用 mutation 改变 Store&#xff1a;2.4 带参数的 mutations:2.5 使用 getters 读取 store 数据2.6 使用 actions 执行异步代码2.7 总结2.8 使用 mapper 简化代码2.9 使用模块组织 store2.10 模块名字空间2…