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

2023-10-26

1.概念

物理地址:物理地址空间是实在的存在于计算机中的一个实体,在每一台计算机中保持唯一独立性。我们可以称它为物理内存;如在32位的机器上,物理空间的大小理论上可以达到2^32字节(4GB),但如果实际装了512的内存,那么其物理地址真正的有效部分只有512MB = 512 * 1024 KB = 512 * 1024 * 1024 B(0x00000000~0x1fffffff)。其他部分是无效的。

虚拟地址:虚拟地址并不真实存在于计算机中。每个进程都分配有自己的虚拟空间,而且只能访问自己被分配使用的空间。理论上,虚拟空间受物理内存大小的限制,如给有4GB内存,那么虚拟地址空间的地址范围就应该是0x00000000~0xFFFFFFFF。每个进程都有自己独立的虚拟地址空间。这样每个进程都能访问自己的地址空间,这样做到了有效的隔离。

在上面我们提到了合理的内存管理机制。我们这里虚拟地址和物理地址之间的映射是通过MMU(内存管理单元)来完成的。
在这里插入图片描述
MMU:将虚拟的地址转化为物理地址。
段错误:内存访问非法,内核空间受保护
堆空间存储后一定要释放

优点:

1.既然每个进程的内存空间都是一致而且固定的,所以链接器在链接可执行文件时,可以设定内存地址,而不用去管这些数据最终实际的内存地址,这是有独立内存空间的好处。

2.当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存。

3.在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存的连续空间,可以利用碎片。

另外,事实上,在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射),等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。还有进程运行过程中,要动态分配内存,比如malloc时,也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置,当进程真正访问到此数据时,才引发缺页异常。

在这里插入图片描述

在这里插入图片描述
在进程里平时所说的指针变量,保存的就是虚拟地址。当应用程序使用虚拟地址访问内存时,处理器(CPU)会将其转化成物理地址(MMU)。

这样做的好处在于:
进程隔离,更好的保护系统安全运行
屏蔽物理差异带来的麻烦,方便操作系统和编译器安排进程地址

推荐一篇好文
https://www.cnblogs.com/clover-toeic/p/3754433.html

https://blog.csdn.net/qq_38526635/article/details/81981971?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164552919516780269823158%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=164552919516780269823158&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogsobaiduend~default-1-81981971.nonecase&utm_term=RAM+ROM+cpu&spm=1018.2226.3001.4450

https://www.jianshu.com/p/b6356e0ec63c

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

虚拟地址空间和物理地址空间 的相关文章

  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是

随机推荐

  • 数据库设计中常见表结构的设计技巧

    一 树型关系的数据表 不少程序员在进行数据库设计的时候都遇到过树型关系的数据 例如常见的类别表 即一个大类 下面有若干个子类 某些子类又有子类这样的情况 当类别不确定 用户希望可以在任意类别下添加新的子类 或者删除某个类别和其下的所有子类
  • 使用MQTT.fx向ThingsBoard发布遥测数据

    一 在ThingsBoard平台新建设备 复制访问令牌 二 打开MQTT fx进行连接 填写服务地址及端口以及设备访问令牌 特别注意 这里踩了个深坑 这个端口一定要对应thingsboard服务thingsboard yml中的配置 这个端
  • c语言回文数

    回文数 include
  • 微信小程序:云开发·初探

    Good days give you happiness and bad days give you experience 顺境带来快乐 逆境带来成长 云开发 quickstart 这是云开发的快速启动指引 其中演示了如何上手使用云开发的三
  • VSCode集成PlantUML

    VSCode集成PlantUML 哈喽大海豚 前端 2018 01 23 前端 UML PlantUML VSCode PlantUML介绍 PlantUML是一个允许快速编写以下图类的组件 序列图 Sequence diagram 用例图
  • 常见Windows硬件故障

    电脑主机滴滴滴响是什么原因 不同的响声代表不同的硬件问题 一下是几种主板设置的提示声音代表的具体问题 1 AWARD的BIOS设定为 长声不断响 内存条未插紧 2短 系统正常启动 2短 CMOS设置错误 需重新设置 1长1短 内存或主板错误
  • CollAFL: Path Sensitive Fuzzing 模糊测试论文阅读

    CollAFL Path Sensitive Fuzzing 会议 S P2018 这是一篇内容十分饱满的Fuzz文章 受益匪浅 1 Abstract and Introduction 对于覆盖率引导的模糊测试来说 跟踪覆盖率是至关重要的
  • IT风投案例分析——facebook

    Facebook 虽然Facebook对于中国人来说是一个不存在的网站 但这并不能妨碍它成为世界前列的互联网公司 Facebook是很特殊的 它的创始人扎克伯格1984年出生 在2004年就开始创建Facebook 当时他只有仅仅二十岁 那
  • Vivado软件的一些报错总结

    1 Synth 8 2543 port connections cannot be mixed ordered and named E FPGA project Xilinx ZYNQ three days sobel 032 face o
  • 渗透测试概述与流程

    渗透测试概述 渗透测试是一种通过模拟攻击的技术与方法 挫败目标系统的安全控制措施并获得控制访问权的安全测试方法 网络渗透测试主要依据CVE已经发现的安全漏洞 模拟入侵者的攻击方法对网站应用 服务器系统和网络设备进行非破坏性质的攻击性测试 C
  • 华为od 安全测试岗 简谈机试面试【更新完】

    PS 准备慢慢更新下最近我在od的机试题以及一二轮面试题和hr面 主管面 最后成功拿到offer 但不打算去了 然后成功让对接人破防 od懂得都懂 流程是 机试 gt 一面 gt 中间穿插了性格测试考试 gt 二面 gt HR面 gt 综面
  • 关于微信小程序的生命周期

    关于微信小程序的生命周期 onLaunch 官网App vue App uvue uni app官网 问题描述 我现在有个小程序 取名为a 有个用户b 从来没有打开过小程序 那么他第一次打开小程序的时候会触发onLaunch 然后用户b退出
  • flask+mysql+ECharts+ajax+百度地图实现数据可视化

    思路 1 后台连接数据库创建session对象 2 创建表关系映射 3 查询数据 4 将数据封装成特定格式 json 5 前台通过ajax请求指定路由异步加载数据并在地图上展示 先来看一下效果 地图参考 https gallery echa
  • uniapp tabbar底部栏 子组件页面不刷新解决方案

    场景 uniapp 来回切换底部栏tabbar 页面初始化数据 当前子组件页面会发送数据请求 再次切换进入 当前页面的子组件不发送请求 解决方案 1 父组件在onShow钩子里面中向子组件传递随机数 2 子组件接收数据 并进行watch监听
  • Android 系统设置中显示设置之休眠和屏保设置篇

    Android 系统设置中显示设置之休眠和屏保设置篇 在上一篇中我们学习了Android系统设置中字体大小和屏幕旋转设置基本内容 在这一篇中我们继续学习显示设置中的休眠和屏保设置 1 休眠设置 首先我们来看一下休眠设置在界面中的定义 1
  • js--for循环99乘法表的四种样式

  • Eclipse/Code blocks/PyCharm连接MySQL数据库初尝试

    第一次使用MySQL 在此罗列我搭配环境的一些路程 我最终Code blocks和Eclipse成功了 Pycharm一直因为版本不合适未成功 我也把我试过的未成功的方法罗列在此 希望可以得到最终的解决 Code blocks 我在用cod
  • Cocos Creator组件化开发之——地图类缩放拖动点击组件

    好记性不如烂笔头 记录开发过程中的点点滴滴 xshu 书写是对思维的缓存 佚名 进入正题 在游戏开发过程中经常会遇到渲染元素的尺寸大于你所能展示的区域 需要玩家自行进行操作 拖动以及点击 比如地图通常会超出玩家所示区域 这个时候需要一个能够
  • STM32F103ZET6+IIC+SGP30气体传感

    STM32F103ZET6 IIC SGP30气体传感 为了加深对IIC协议的理解和应用 接下来 使用STM32驱动SGP30气体传感传感器 准备IIC协议 用的还是之前的那些代码 只是把GPIO引脚口改了一下而已 1 声明GPIO和IIC
  • 虚拟地址空间和物理地址空间

    1 概念 物理地址 物理地址空间是实在的存在于计算机中的一个实体 在每一台计算机中保持唯一独立性 我们可以称它为物理内存 如在32位的机器上 物理空间的大小理论上可以达到2 32字节 4GB 但如果实际装了512的内存 那么其物理地址真正的