虚拟内存【Linux】

news2024/9/22 19:32:55

虚拟内存

  • 为什么需要虚拟内存
  • Linux虚拟内存的结构
    • 32位系统下的虚拟地址空间
    • 64位系统下的虚拟地址空间
    • 页表
    • 多级页表
    • TLB
  • 流程
  • 虚拟内存的作用

为什么需要虚拟内存

  为了在进行多进程编码进行内存访问的时候保持内存的隔离性,数据安全性,所以出现了虚拟内存。举一个例子:
  如果没有虚拟内存,我们在编码一个程序的时候将数据写在了编号为1000的物理内存上,当我们编码另外一个程序的时候,就需要注意,避免写入或修改上一个程序在编号为1000的物理内存处的数据,当已经有了几百个程序对物理内存进行过读写时,我们在进行内存读写的时候就会变得格外困难(因为需要避免覆写已经有数据的物理内存空间)。
  所以虚拟内存的出现解决了这个问题。

Linux虚拟内存的结构

  每一个进程都会分配一个独立的虚拟内存空间,独立的页表。不同的进程拥有相同结构的虚拟内存空间。分为32位和64位系统的虚拟地址空间。
在这里插入图片描述

32位系统下的虚拟地址空间

在这里插入图片描述
  可以看的出来,内核空间位1G,用户空间为3G。

64位系统下的虚拟地址空间

在这里插入图片描述

  进入内核态的时候使用内核空间,进入用户态的时候使用用户空间,比如使用系统调用的时候就会进入内核态,发生缺页中断也会进入内核态。
  不同进程的内核空间都是统一的,不同进程的用户空间都是独立的。
在这里插入图片描述

页表

  虚拟空间是通过页表,就能通过虚拟地址,得到物理内存上的物理地址,从而进行对物理内存上的读写。
  页表是存储在内核空间的,而内核空间是当操作系统启动的时候就加载到物理内存上的,一般不会进行内存交换。
在这里插入图片描述
  页表可以像上图一样理解,虚拟地址和物理地址一一映射,除了这个,其他的页表项,比如有效位可以分辨该空间是否被使用,读写权限可以保障数据的安全性。

多级页表

  虚拟内存和物理内存一定得是一一对应的,但是如果4Gb的物理内存和虚拟内存都一一映射的话,就会导致页表过于庞大。为了解决这个问题,引入了多级页表。如下图所示:
在这里插入图片描述
  但是如果多个进程都要实现自己的虚拟内存和物理内存一一映射的话,那么就算是多级页表,也会使得存储在内核空间的多进程的页表十分庞大。通过局部性原理我们知道,经常使用访问的数据大部分时候都是集中在那么几块页中,因此我们运行程序的时候不需要将全部程序都加载进内存中,需要时再换入,内存紧张时再换出到磁盘,这就使得每一个进程实际使用的物理内存空间不大,相应的,所需要的页表也就不需要那么多。这带来的好处就是进程使用的内存可以大于实际的物理内存。

TLB

  多级页表在检索的时候也会出现效率低下的问题,并且由于局部性原理,我们可以将一些常访问的页表项存储带I/O效率更快的硬件TLB(也叫做快表)中,这样就可以解决上述问题。

流程

  1. cpu拿到虚拟内存中的虚拟地址。
  2. 通过MMU(内存管理单元)查询TLB中的页表项是否含有该虚拟地址到物理地址的映射,如果有,直接返回,如果没有,MMU则查询页表。
  3. 如果在页表中查询到该虚拟地址到物理地址的映射,则直接返回,如此,cpu就拿到了相应的物理地址,可以进行操作。否则,cpu会触发一个缺页中断,然后操作系统会将磁盘上相应的页加载进物理内存,并且更新页表,将新加载进物理内存的页面进行同虚拟内存的映射。
  4. 然后回到第3步,MMU重新查询页表,此时已经有了映射,cpu成功拿到物理地址。

虚拟内存的作用

  1. 使得进程使用的内存空间大于物理内存实际的空间。
  2. 每个进程拥有独立的虚拟内存,在多进程的情况下,使得进程之间不会访问到除自己内存空间外的地址,解决了多进程地址冲突的问题。
  3. 页表项中还含有一些表明页面属性的项,比如读写权限,有效位,使得我们不可以随意访问一些不可修改的页, 增加了数据的安全性。
  4. 每一个进程都拥有相同的虚拟地址空间,使得我们对于内存管理更加容易了,减少了代码的错误和地址的冲突。

      😄 创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看😄

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

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

相关文章

C++--智能指针

普通指针创建动态内存的问题: 1.new和new[]的内存需要使用delete和delete []释放。 2.有时忘记释放内存。 3.不知该在何时释放内存。 智能指针的优点: 在不需要对象时自动释放对象,从而避免内存泄漏和其他与内存管理相关的问题。 智能指针有:unique_ptr,share…

可转债之强赎条款

摘要:每天学习一点金融小知识 做可转债投资,强赎风险是特别需要注意的,若投资者没有及时采取措施,就有可能造成很大的损失。本文从可转债的定义、强赎条款的原因及强赎的情况几个方面来介绍下可转债的强赎条款。 什么是可转换债券…

算法——同步算法

在力扣有这样一道题求交集,与此类似的还有求差集,相关的解法有很多。我这里提供一种思路:利用C的容器set对这两个数组去重,遍历数组插入set即可去重。再同时遍历比较set的每个元素。 代码实现很简单,如下所示&#xff…

【第四届会后4个月检索】第五届计算机网络安全与软件工程国际学术会议(CNSSE 2025)

第五届计算机网络安全与软件工程国际学术会议(CNSSE 2025) 2025 5th International Conference on Computer Network Security and Software Engineering 重要信息 大会官网:www.cnsse.org 大会时间:2025年2月21-23日 会议地点&…

CTF-PWN-kernel-栈溢出(retuser rop pt_regs ret2dir)

文章目录 参考qwb2018 core检查逆向调试打包上传测试脚本retuserkernel ropinit_credcommit_creds( prepare_kernel_cred(0) )开启KPTI利用swapgs_restore_regs_and_return_to_usermode开启KPTI利用SIGSEGVrop设置CR3寄存器再按照没有KPTI返回 kernel rop ret2userpt_regs 构造…

使用命令行修改Ubuntu 24.04的网络设置

Ubuntu里,使用命令行下修改IP地址,网上有很多方案,我最终觉得这个方案(使用Netplan)最好,最根本,记录下来备查 1.使用命令ip link show 查看Ubuntu上可以使用的网络接口名称 2.查找Netplan的配…

全志T527 适配YT8531 双以太网

一、确认硬件接口 phy1: phy2: PHY 地址设置: YT8531 的地址由上图所示的三个管脚外接 ( 或内部默认 ) 电阻来配置。外部不接上下拉电阻时,内部默认 phy 地址为 000( 十进制 0) ;若外接电阻,例如上图所接…

前端面试题33(实时消息传输)

前端实时传输协议主要用于实现实时数据交换,特别是在Web应用中,它们让开发者能够构建具有实时功能的应用,如聊天、在线协作、游戏等。以下是几种常见的前端实时传输协议的讲解: 1. Short Polling (短轮询) 原理:客户…

二分查找3

1. 有序数组中的单一元素(540) 题目描述: 算法原理: 二分查找解题关键就在于去找到数组的二段性,这里数组的二段性是从单个数字a开始出现然后分隔出来的,如果mid落入左半部分那么当mid为偶数时nums[mid1]…

搞清楚[继承],易如反掌

穷不失义,达不离道。——孔丘《论语》 继承 1、简单理解2、继承2、1、继承的概念2、2、继承定义2、3、基类和派生类对象赋值转换2、4、继承中的作用域2、5、派生类默认成员函数2、6、继承中的特点2、6、1、友元2、6、2、静态成员2、6、3、菱形继承及菱形虚拟继承 3、…

【开源】基于RMBG的一键抠图与证件照制作系统【含一键启动包】

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

2024浙江外国语学院汉语桥线上项目 “在杭州,看见更好的中国”开班

7月9日上午,由教育部中外语言交流合作中心主办、浙江外国语学院国际商学院承办的2024汉语桥“在杭州,看见更好的中国”线上项目正式启动。项目负责人何骅老师及汉语桥教师团队,与来自越南、缅甸、日本、俄罗斯的100名学员相聚云端&#xff0c…

JavaSE学习笔记第二弹——对象和多态(上)

目录 面向对象基础 面向对象程序设计的定义 类的基本结构 成员变量 成员方法 方法定义与使用 设计练习 方法重载 构造方法 静态变量和静态方法 String和StringBuilder 基本含义 区别 总结 今天我们继续来学习JavaSE,扩展和Java相关的知识,…

当CNN遇上Mamba,高性能与高效率通通拿下!

传统视觉模型在处理大规模或高分辨率图像时存在一定限制,为解决这个问题,研究者们就最近依旧火热的Mamba,提出了Mamba结合CNN的策略。 这种结合可以让Mamba在处理长序列数据时既能够捕捉到序列中的时间依赖关系,又能够利用CNN的局…

android自定义键盘弹窗

样式布局 要在Android中自定义键盘弹窗&#xff0c;先要创建一个新的XML布局文件&#xff0c;用于定义键盘弹窗的外观和布局。例如&#xff0c;创建一个名为key_alert_dialog.xml的文件&#xff0c;并在其中添加所需的按钮和其他UI元素。 <?xml version"1.0" e…

7月9日学习打卡-回文链表,交叉链表

大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不足之…

海外多语言盲盒APP系统开发

随着盲盒的全球化发展&#xff0c;盲盒已经成为了一个热门行业&#xff0c;不仅深受我国消费者的青睐&#xff0c;更是深受海外消费者的喜爱。目前&#xff0c;盲盒出海已经成为了企业拓展市场的新机会。 在数字化时代&#xff0c;海外盲盒APP为企业提供了一个快速打开海外盲盒…

57、基于概率神经网络(PNN)的分类(matlab)

1、基于概率神经网络(PNN)的分类简介 PNN&#xff08;Probabilistic Neural Network&#xff0c;概率神经网络&#xff09;是一种基于概率论的神经网络模型&#xff0c;主要用于解决分类问题。PNN最早由马科夫斯基和马西金在1993年提出&#xff0c;是一种非常有效的分类算法。…

MyBatis框架学习笔记(一):MyBatis入门

1 MyBatis 介绍 1.1 官方文档 MyBatis 中文手册&#xff1a; &#xff08;1&#xff09;https://mybatis.org/mybatis-3/zh/index.html &#xff08;2&#xff09;https://mybatis.net.cn/ Maven 仓库&#xff1a; https://mvnrepository.com/ 仓库作用&#xff1a;需要…