0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

虚拟地址和逻辑地址的区别是什么?

Linux爱好者 来源:飞天小牛肉 作者:飞天小牛肉 2021-06-17 14:08 次阅读

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

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

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

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

我们需要知道的是,所有这些打印出来的地址都是虚拟的,在物理内存中这些地址并不真实存在,它们最终都将由操作系统和 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 个进程共享物理内存:

79d804b4-ca6f-11eb-9e57-12bb97331649.png

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

那么如何对每个进程使用的地址进行保护(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)。

原文标题:你看到的所有地址都不是真的

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10901

    浏览量

    212885
  • Linux
    +关注

    关注

    87

    文章

    11342

    浏览量

    210292

原文标题:你看到的所有地址都不是真的

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MAC地址的作用范围,MAC地址怎么申请?

    MAC地址(MediaAccessControlAddress),也称为局域网地址(LANAddress)、以太网地址(EthernetAddress)、硬件地址(HardwareAd
    的头像 发表于 12-19 17:44 639次阅读
    MAC<b class='flag-5'>地址</b>的作用范围,MAC<b class='flag-5'>地址</b>怎么申请?

    怎么绑定IP地址和MAC地址

    本篇文章主要说一说怎么在本地计算机上绑定IP和MAC地址以及通过路由器绑定IP和MAC地址,并且这两者绑定可以解决什么问题。   先来说说怎么去绑定 本地计算上绑定IP和MAC地址: 首先获取IP
    的头像 发表于 12-01 22:48 388次阅读

    为什么ip地址通常以192.168开头?

    不同的IP地址类型,它们之间的区别在于它们所在的网络范围和使用方式。 公网地址:被称为全球唯一IP地址,是指可以直接在internet上访问的IP
    的头像 发表于 11-20 09:40 337次阅读

    IP地址小分享

    一、IP地址的作用与重要性 唯一标识:在网络通信中,每个连接到互联网的设备都必须拥有唯一的IP地址,这样才能确保数据在网络中正确地路由和传递。想象一下,如果网络中的设备没有IP地址或者IP地址
    的头像 发表于 09-25 14:21 278次阅读
    IP<b class='flag-5'>地址</b>小分享

    域名、IP 地址、网址分别是什么?有什么区别呢?

    域名、IP 地址和网址我们经常会听到这三个名词,尤其是当你想要开通一个网站的时候,但很多人对它们之间的区别并不十分清楚,那么域名、IP 地址、网址分别是什么?有什么
    的头像 发表于 09-18 11:13 785次阅读
    域名、IP <b class='flag-5'>地址</b>、网址分<b class='flag-5'>别是</b>什么?有什么<b class='flag-5'>区别</b>呢?

    数据总线和地址总线的区别

    数据总线和地址总线是计算机系统中至关重要的两种总线,它们在数据传输和地址指定方面发挥着不同的作用。
    的头像 发表于 09-10 11:40 2680次阅读

    IP地址与子网划分

    子网的划分,实际上就是设计子网掩码的过程,它指的是指将一个给定的IP网络地址空间划分为更小的子网络。 在子网掩码中用1和0来分别网络号和主机号,其中是1的表示是网络部分,0表示的是主机部分,所有
    的头像 发表于 09-06 09:46 415次阅读

    怎么申请MAC地址?不同申请方式的区别是什么?

    蓝牙设备的MAC地址是指蓝牙模块中使用的唯一标识符,用于在网络中识别和区分不同的蓝牙设备。这个MAC地址是由美国电气和电子工程师协会(IEEE)分配的,而不是由蓝牙联盟直接分配的。接来来英利检测将
    的头像 发表于 08-22 16:55 822次阅读
    怎么申请MAC<b class='flag-5'>地址</b>?不同申请方式的<b class='flag-5'>区别是</b>什么?

    购买海外虚拟IP地址可以通过以下几种方式#虚拟IP地址

    ip地址
    jf_62215197
    发布于 :2024年08月16日 07:16:04

    IP地址的分配

    公有IP地址与私有IP地址 公有IP地址:用于互联网上的全球唯一地址,由互联网号码分配机构(IANA)和区域互联网注册机构(RIR)分配。比如说: “ 8.8.8.8 ”就是谷歌的DN
    的头像 发表于 08-09 14:55 1373次阅读

    IP地址基础科普

    IP地址是我们在网络上识别设备的“身份证”。 1. 什么是IP地址? IP地址是一个用来标识网络设备的数字地址。IPv4地址由32位数字组成
    的头像 发表于 07-22 11:55 643次阅读

    怎么申请MAC地址?MAC地址申请流程分享

    在数字化高速发展,机器设备大规模代替原始劳动力的时代,功能各异的设备不断被创造出来。因此每一台网络设备都需要一个独特的身份标识,这也就是我们所熟知的MAC地址。MAC地址作为设备的唯一标识符,在网
    的头像 发表于 07-10 17:30 600次阅读
    怎么申请MAC<b class='flag-5'>地址</b>?MAC<b class='flag-5'>地址</b>申请流程分享

    MAC地址码申请指南:散装串号与主体关联的大中小号段的区别

    中的地址分配。这个是毋庸置疑是获取MAC地址的唯一途径。而想要申请MAC地址,常见的有两种方式:分别是购买别的主体注册过的散装串号以及用自己主体直接向IEEE申请的
    的头像 发表于 04-24 17:48 903次阅读
    MAC<b class='flag-5'>地址</b>码申请指南:散装串号与主体关联的大中小号段的<b class='flag-5'>区别</b>

    CentOS虚拟机克隆后开机无法获取IP地址的解决策略

    克隆虚拟机后出现一台能获取到IP地址,另外一台获取不到IP地址,查看MAC地址后,发现两台MAC地址相同。
    的头像 发表于 04-17 12:27 806次阅读
    CentOS<b class='flag-5'>虚拟</b>机克隆后开机无法获取IP<b class='flag-5'>地址</b>的解决策略

    虚拟机的ip地址和主机一样吗

    地址,用于与其他设备进行通信。下面将详细介绍虚拟机的IP地址和主机的IP地址之间的区别和联系。 IP地址
    的头像 发表于 03-26 15:34 5568次阅读