前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你真的懂物理地址和逻辑地址吗?

你真的懂物理地址和逻辑地址吗?

作者头像
xujjj
发布2020-05-22 14:55:18
4K0
发布2020-05-22 14:55:18
举报
文章被收录于专栏:IT界的泥石流IT界的泥石流

Hello,小伙伴们大家好,祝大家新的一年健康快乐,心想事成,万事如意。最重要的一点是:大家出门一定要戴好口罩,勤洗手,不到人群密集的地方去,老老实实呆家里最好了。武汉加油,中国加油!

好了,回归这题,本篇文章主要给大家讲述一下物理地址逻辑地址的概念,以及它们之间的联系与区别。ps:本文以Intel8086处理器为例讲述。

我们都知道,CPU是需要从内存中取数据来进行运算的,或者需要把一些数据存放到内存中的。如下图所示,左边是内存的结构图,右边是CPU,CPU和内存之间数据进行交互。然后呢,CPU总要知道把数据放到内存中的哪个位置,或者CPU也要知道应该在内存中的哪个位置取数据出来把。所以诞生了地址的概念,可以看到,在下图左边的内存结构图中,我们用0000~000A去标识每个存储单元,每个存储单元大小为1个字节(就是图中的一行)。这样我们的CPU就可以找到内存中的某个位置,然后开始取数据或者存放数据了。

同时,我们的程序是由操作系统加载到内存中才可以运行的,所以此时假设我们写的一个程序被操作系统加载到内存中了,如下图所示。

我们的程序分为了代码段和数据段,代码段是存放着要执行的指令,数据段存放着数据。图中所有数值的表示都是采用十六进制表示法表示的。(1位十六进制就相当于4位的二进制)。

所以CPU从代码段开始取出指令,然后就开始执行指令,可以看到,CPU取出的第一条指令是mov ax, [0001],这条指令是什么意思呢?就是把内存地址为[0001]上的数据取出来,放到AX寄存器中,AX寄存器的作用是CPU里面存放临时数据的。AX寄存器一共是2个字节。因为AX寄存器的存储大小为2个字节,所以取出数据的大小也为2个字节,即要把[0001]和[0002]位置的数据都取出来,然后进行拼接,拼接结果为0100,最后放到AX寄存器中。如下图。(0100是十六进制表示,其二进制表示为0000 0001 0000 0000,因此是2个字节,16位)。以上过程中的[0001]就是我们所要说的物理地址,它是一个绝对的固定的地址

那假如我们指令中的地址用的是物理地址(绝对地址),会产生怎样的问题呢?刚开始我们说过,操作系统从硬盘上读取我们的程序,然后加载到内存中运行,那加载到内存的过程是由操作系统决定的,万一操作系统把我们的程序中的数据段加载到内存地址为[0003]的位置处,这会发生什么呢?如下图。

如果我们将[0001]当成物理地址的话,那么mov ax,[0001]这句指令读取到的将会是错误的内容。因为,我们想要读取的数据是[0003]和[0004]所拼接而成的数据,而该条指令读取的却是[0001]和[0002]的内容,[0001]和[0002]中所存放的内容未知,因此,如果我们把[0001]当作物理地址时,那么该条指令执行完毕的结果是读到一个错误的内容,这是不行的!

由此,便诞生了我们将要说的逻辑地址的概念,物理地址它是固定不变的,而逻辑地址会随着程序加载到内存中的位置而变化。好,我们接下来看一下什么是逻辑地址。

首先来看一下mov ax,[0001]这条指令,其实呢,我们的编译器会将其转化为mov ax,[0000],而并不是像上文所讲的那样,将[0001]看作一个物理地址然后直接去寻址,上文所讲只是为了说明其问题所在,而引入逻辑地址的。然后这个[0000]是偏移地址的概念。操作系统把我们程序中的数据段放到了[0003]的位置处,那么这个[0003]就是段地址的概念。最后段地址+偏移地址=逻辑地址,也就是[0003]+[0000]=[0003],最后CPU会在[0003]这个逻辑地址中找到正确的数据。

如果数据段还是在[0001]开始的位置处呢?没关系,[0001]+[0000]=[0001],最后依旧会在[0001]这个位置开始找到指令所需要的正确的数据。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT界的泥石流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档