返回顶部
首页 > 资讯 > 操作系统 >浅析操作系统中的虚拟地址与物理地址
  • 835
分享到

浅析操作系统中的虚拟地址与物理地址

2024-04-02 19:04:59 835人浏览 泡泡鱼
摘要

目录一、前言二、你看到的所有地址都不是真的三、物理寻址 Physical Addressing四、虚拟寻址 Virtual Addressing一、前言 先解释下一个困扰了我很久的

一、前言

先解释下一个困扰了我很久的问题:虚拟地址(vitural address)和逻辑地址(logical address)的区别。

大部分操作系统的书籍要么写的是虚拟地址,要么写的是逻辑地址,看的我一脸懵逼。

在《深入理解 linux 内核》这本书中终于找到了确切的答案,这里我就不写出来了,扣概念的话这俩确实是有些区别的,不过对于我们日常使用以及理解操作系统来说的话,暂且可以把虚拟地址和逻辑地址理解为同一个意思。

二、你看到的所有地址都不是真的

下面这段 C 代码摘录自《操作系统导论 - [美] 雷姆兹·H.阿帕希杜塞尔》,依次打印出 main 函数的地址,由 malloc(类似于 Java 中的 new 操作)返回的堆空间分配的值,以及栈上一个整数的地址:

得到以下输出:

我们需要知道的是,所有这些打印出来的地址都是虚拟的,在物理内存中这些地址并不真实存在,它们最终都将由操作系统和 CPU 硬件翻译成真正的物理地址,然后才能从真实的物理位置获取该地址的值。

OK,上述就当作一个引子,让各位对物理地址和虚拟地址有个直观的理解,下面正文开始。

三、物理寻址 Physical Addressing

物理地址的概念很好理解,你可以把它称为真正的地址。《深入理解计算机系统 - 第 3 版》中给出的物理地址(physical address)的定义如下:

计算机系统的主存被组织成一个由 M 个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址。

比如说,第一个字节的物理地址是 0,接下来的字节地址是 1,再下一个是 2,以此类推,给定这种简单的结构,CPU 访问内存的最自然的方式就是使用这样的物理地址。我们把这种方式称为物理寻址(physical addressing)。

举个例子,比如说当程序执行了一条加载指令,指令内容是从物理地址 4 中读取 4 字节字传送到某个寄存器中。

物理寻址过程如下:当 CPU 执行到这条指令时,会生成物理地址 4,然后通过内存主线,把它传递给内存,内存取出从物理地址 4 处开始的 4 字节字,并将它返回给 CPU,CPU 会将它存放到指定的寄存器中。看下图:

其实不难发现,物理寻址这种方式,每一个程序都直接访问物理内存,其实是存在重大缺陷的:

1)首先,用户程序可以寻址内存的任意一个字节,它们就可以很容易地破坏操作系统,从而使系统慢慢地停止运行。

2)再次,这种寻址方式使得操作系统中同时运行两个或以上的程序几乎是不可能的。

举个例子,我们打开了三个相同的程序(计算器),都执行到某一步。比方说,用户在这三个程序的界面上分别输入了 10、100、1000,其对应的指令就是把用户输入的数字保存在内存中的某个地址中。如果这个位置只能保存一个数,那应该保存哪个呢?这不就冲突了吗?

再举个例子,摘自《现代操作系统 - 第 3 版》:

一个程序给物理内存地址 1000 赋值也就是存入了一些数据后,另一个程序也同样给这个地址赋值,那么第二个程序的赋值会覆盖掉第一个程序所赋的值,这会造成两个程序同时崩溃。

当然了,我们也说了是几乎不可能,不是完全不可能,还是有一些方法可以在物理寻址这种方式下实现多个程序并发运行的。

最简单的方法就是:首先,将空闲的进程存储在磁盘上,这样当它们不运行时就不会占用内存,然后,让一个程序(或者说进程)单独占用全部内存运行一小段时间,当发生上下文切换的时候,就停止这个进程,并将它所有的状态信息保存在磁盘上,再加载其他进程的状态信息,然后运行一段时间...... 只要在某一个时间内存中只有一个程序,那么就不会发生上述所说的地址冲突。这就实现了一种比较粗糙的并发。

为什么说他是粗糙的呢,因为这种方法有一个问题:将全部的内存信息保存到磁盘太慢了!特别是当内存增长的时候。

因此,我们考虑把进程对应的内存一直留在物理内存中,在发生上下文切换的时候就切换到特定的区域。

如下图所示,有 3 个进程(A、B、C),每个进程拥有从 512KB 物理内存中切出来给它们的一小部分内存,可以理解为这 3 个进程共享物理内存:

显然,这种方式是存在一定安全隐患的。毕竟如果各个进程之间可以随意读取、写入内容的话那就乱套了。

那么如何对每个进程使用的地址进行保护(protection)呢?继续使用物理内存模型肯定是不行了,因此操作系统创造了一个新的内存抽象,引入了一个新的内存模型,那就是虚拟地址空间,很多书中都会直接称呼为 “地址空间(Address Space)”。

四、虚拟寻址 Virtual Addressing

我先通俗地解释下虚拟地址空间和虚拟地址的概念,直接上书中的定义读起来有点生涩。

就是说每个进程的栈啊、堆啊、代码段啊等等它们的实际物理内存地址对于这个进程来说是不可见的,谁也不能直接访问这个物理地址。

那我们怎么去访问这个进程呢?

操作系统会给每个进程分配一个虚拟地址空间(vitural address),每个进程包含的栈、堆、代码段这些都会从这个地址空间中被分配一个地址,这个地址就被称为虚拟地址。底层指令写入的地址也是虚拟地址。

每个进程都拥有一个自己的地址空间,并且独立于其他进程的地址空间。也就是说一个进程中的虚拟地址 28 所对应的物理地址与另一个进程中的虚拟地址 28 所对应的物理地址是不同的,这样就不会发生冲突了。

可以这么理解,物理地址就是一个仓库,虚拟地址就是一个门牌,比方说一共有三十个门牌,那么所有的进程都能看见这三十个门牌,但是他们看见的某个相同门牌,指向的并不是同一个仓库。

OK,下面再来看《现代操作系统 - 第 3 版》书中对于地址空间的解释,应该很容易理解了:

地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(除了在一些特殊情况下进程需要共享它们的地址空间外)。

地址空间的概念非常通用,并且在很多场合中出现。比如电话号码,在美国和很多其他国家,一个本地电话号码通常是一个 7 位的数字。因此,电话号码的地址空间是从 0 000 000 到 9 999 999。

地址空间也可以是非数字的,以 “.com” 结尾的网络域名的集合也是地址空间。这个地址空间是由所有包含 2~63 个字符并且后面跟着 “.com” 的字符串组成的,组成这些字符串的字符可以是字母、数字和连字符。

到现在你应该已经明白地址空间的概念了,它是很简单的。

有了虚拟地址空间后,CPU 就可以通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到内存之前会先被转换成合适的物理地址,这个虚拟地址到物理地址的转换过程称为 地址翻译/地址转换(address translation)。

地址翻译需要 CPU 硬件和操作系统的密切合作:CPU 上的内存管理单元(Memory Management Unit,MMU)就是专门用来进行虚拟地址到物理地址的转换的,不过 MMU 需要借助存放在内存中的查询表,而这张表的内容正是由操作系统进行管理的。

那么,上述这一套 CPU 生成虚拟地址并进行地址翻译的流程就是虚拟寻址(virtual addressing)。举个例子,看下图:

以上就是浅析虚拟地址与物理地址的详细内容,更多关于虚拟地址 物理地址的资料请关注编程网其它相关文章!

--结束END--

本文标题: 浅析操作系统中的虚拟地址与物理地址

本文链接: https://lsjlt.com/news/128700.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅析操作系统中的虚拟地址与物理地址
    目录一、前言二、你看到的所有地址都不是真的三、物理寻址 Physical Addressing四、虚拟寻址 Virtual Addressing一、前言 先解释下一个困扰了我很久的...
    99+
    2024-04-02
  • Linux虚拟内存地址怎么转化成物理内存地址
    这篇文章主要讲解了“Linux虚拟内存地址怎么转化成物理内存地址”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux虚拟内存地址怎么转化成物理内存地址”吧!背景现代手机这种SOC(sys...
    99+
    2023-06-16
  • Linux之进程的虚拟地址空间,逻辑地址和物理地址,进程管理命令
    目录进程的虚拟地址空间1.内核空间(1G)2 栈(stack)3 内存映射段(mmap)4 堆(heap)5 .BSS段6 数据段(.Data)7 代码段(text)8 保留区逻辑地址进程管理命令进程恢复总结进程的虚拟地...
    99+
    2023-03-23
    Linux进程 进程虚拟地址空间 逻辑地址和物理地址 进程管理命令
  • 浅析IP代理地址的作用有哪些
    这篇文章主要介绍浅析IP代理地址的作用有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!现在因特网给大家的工作和生活带来了很多方便,但是我们在因特网接入中也会遇到一些网络问题,导致因特网的实际操作无法一切正常进行,...
    99+
    2023-06-15
  • 凝思操作系统配置IP地址方法
    方法1: /etc/network/interfaces文件中配置: # The loopback network interfaceauto loiface lo inet loopbackallow-hotplug eth0auto e...
    99+
    2023-09-15
    tcp/ip 服务器 linux
  • 云服务器地域和操作系统如何选择地址
    云服务器地域和操作系统选择通常有以下几个因素需要考虑: 地理位置:一般来说,云服务器的位置可以放在国内或其他地方,这样您在使用它的时候不会受到国内网络的限制,而且访问速度更快。 系统需求:选择云服务器,您需要考虑系统的运行环境和需求来确...
    99+
    2023-10-26
    如何选择 地域 操作系统
  • 云服务器地域和操作系统如何选中一个地址
    云服务器地域和操作系统选择一般会受到许多因素的影响,以下是一些可能的选择: 数据中心:云服务器通常需要使用数据中心才能访问其资源。你可以选择一个数据中心,这可以是一个虚拟主机或者自己的服务器。 网络速度:云服务器的网络速度也是一个关键考...
    99+
    2023-10-26
    地域 操作系统 地址
  • 云服务器地域和操作系统如何选中其他地址
    云服务器地域和操作系统的选取主要取决于您的业务需求和数据存储地点。以下是一些可能的选项: 数据中心选项: 大多数云服务器提供租用服务,您可以选择您业务需求的数据中心。有些云服务器提供高速互联网连接和存储功能,您可以在这些服务中选择一个更...
    99+
    2023-10-26
    地域 操作系统 地址
  • 在VMware中修改Linux虚拟机的动态IP地址为静态IP地址
    为什么需要将虚拟机修改成静态IP地址 因为如果你想要远程连接你的虚拟机,或虚拟机上的数据库及项目,但是你的虚拟机是动态IP地址的话,每次重启虚拟机时虚拟机的IP地址都会发生改变,这就导致了每次重启虚拟机后都要重新查询虚拟机的IP地址,...
    99+
    2023-09-24
    linux centos 服务器 网络
  • 云服务器地域和操作系统如何选中一个地址的数据
    首先,选择一个可靠的云服务器地域和操作系统需要考虑以下几个因素: 云服务器的稳定性和可用性。在选择云服务器地域和操作系统时,需要考虑云服务器的稳定性和可用性。稳定性指的是云服务器在运行时的稳定性,可用性则指的是云服务器在运行时的性能和可...
    99+
    2023-10-27
    地域 操作系统 地址
  • 云服务器地域和操作系统如何选中其他地址信息
    云服务器的地域选择非常灵活。用户可以选择他们所在的城市或国家,然后使用云服务器在不同的地点访问。这种灵活性允许用户在不同的地区使用相同的云服务器,并且可以根据需要在某些地区部署云服务器,而在其他地区部署物理服务器。此外,云服务器还提供了一些...
    99+
    2023-10-28
    地域 操作系统 地址
  • 云服务器地域和操作系统如何选择端口地址
    云服务器的地域和操作系统是非常重要的因素,以下是一些选择端口地址的建议: 端口:云服务器常用的端口号如下:10/100、10/1000、80(HTTP)、400、800、6000 操作系统:常见的云服务器操作系统包括:IBM、AWS 和...
    99+
    2023-10-26
    如何选择 端口 地域
  • Win8系统怎么查看电脑物理地址(两种方法)
      大家都知道,每台电脑都有一个唯一的物理地址,这个物理地址其实就是MAC地址。有时候在工作中,会需要查看物理地址,那么在Win8系统中药如何去查看呢?下面,小编就给大家分享两个查看Win8查看物理地址的方法。   方法...
    99+
    2023-05-22
    win8查看物理地址 win8系统查看mac地址
  • 云服务器地域和操作系统如何选中一个地址或多个
    选择地域时,您可以考虑以下因素: 服务区域:您需要为多个地域提供服务,并且需要根据地域选择一个地域。 可用区域:您需要选择一个可用区域,以确保您的服务器在任何地域都能正常运行。 网络延迟:您需要选择一个可用网络以满足服务需求。 存储空间...
    99+
    2023-10-27
    多个 地域 操作系统
  • ARM64内核中对52位虚拟地址支持的示例分析
    这篇文章主要为大家展示了“ARM64内核中对52位虚拟地址支持的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ARM64内核中对52位虚拟地址支持的示例分析”这篇文章吧。随着 64 位硬...
    99+
    2023-06-15
  • 云服务器地域和操作系统如何选择端口地址设置
    云服务器地域选择时需要考虑以下几个方面: 地域范围:首先要确定你要使用的云服务器服务地域是什么地方。不同的地区可能会有不同的网络情况,网络带宽也不同。如果你要在中国大陆使用云服务器,那么就需要考虑你的网络环境是否适合。 地域规模:云服务...
    99+
    2023-10-28
    如何选择 端口 地域
  • 云服务器地域和操作系统如何选用端口地址访问
    对于云服务器的用户来说,他们需要通过端口来访问云服务器,比如使用Port来访问云服务器,使用Torrentfall来访问云服务器等等。但是,有些云服务器提供的端口并不能满足所有用户的需求,这时就需要根据自己的需求来选择相应的端口地址。 如...
    99+
    2023-10-27
    端口 地域 操作系统
  • 云服务器地域和操作系统如何选择地址设置方法
    首先,地域对于云服务器的性能和稳定性有着很大的影响。一个地理位置优越的云服务器可能会提供更快的计算速度和更高的性能表现,因为云服务器通常会在多个地点部署和运行。此外,地理位置也会影响到云服务器的成本和可用性。如果用户的业务需要处理大量的数据...
    99+
    2023-10-28
    如何选择 地域 操作系统
  • 虚拟机中CentOS7设置固定IP地址的方法
    由于我的开发环境是在VMWare虚拟机里安装Centos,然后在host文件中设置拦截,这样就可以直接跳转虚拟机的CentOS,但是虚拟机的IP地址总是会变,就要随时修改host文件,很麻烦。决定虚拟机采用固定IP方式,...
    99+
    2022-06-04
    CentOS7 固定IP地址 虚拟机设置固定IP
  • 怎么在VMware虚拟机中查看Linux的IP地址
    怎么在VMware虚拟机中查看Linux的IP地址?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先,在电脑桌面上双击vmware图标,打开软件。然后,点击打开...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作