CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步

CPU将虚拟内存空间中的地址转换为物理地址,需要两步:首先,给出一个逻辑地址(其实就是段中的偏移量,这个一定要明白!!!) ,CPU需要使用其段型内存管理单元先将逻辑地址转换为线程地址,再使用其页型内存管理单元将其转换为最终物理地址。

物理地址

用于内存芯片级的单元寻址,对应处理器和CPU连接的地址总线。

——这个概念应该是这些概念中最好理解的一个,但值得一提的是,虽然物理地址可以直接理解为插入机器的内存本身,但内存被看作是一个大数组从0字节到最大空空间一个字节一个字节的数字,然后这个数组就称为物理地址,但实际上这只是硬件对软件提供的抽象,内存不是这样寻址的。所以说是“对应地址总线”比较合适,但是不考虑物理内存的寻址方式,直接将物理地址映射到物理内存也是可以接受的。或许错误的理解更有利于形而上的抽象。

虚拟内存

这是对整个内存的抽象描述(与机器上的不匹配)。它是相对于物理内存而言的,可以直接理解为“间接”、“假”内存,例如一个0x08000000的内存地址,它不是物理地址元素上大数组中的地址0x08000000-1;

之所以如此逻辑地址转换为物理地址,是因为现代操作系统为内存管理提供了一种抽象,即虚拟内存。进程使用虚拟内存中的地址,操作系统辅助相关硬件将其“翻译”成真实的物理地址。这种“转化”是所有讨论的关键。

通过这种抽象,程序可以使用比其实际物理地址更大的地址空间。 (东墙拆,西墙修,银行也一样),甚至多个进程都可以使用同一个地址。这并不奇怪,因为翻译后的物理地址并不相同。

——可以反编译链接的程序,发现链接器已经给程序分配了地址。比如调用函数A,代码不是调用A,而是调用0x0811111111,即函数A的地址已经固定。没有这种“翻译”,没有虚拟地址的概念,这样做根本行不通。

逻辑地址

为了兼容,Intel保留了古时候的分段内存管理方式。逻辑地址是指用于指定操作数或指令地址的机器语言指令。上例中,连接器分配给A的地址0x08111111就是逻辑地址。

——但是很抱歉,这么说好像违反了Intel中段管理中对逻辑地址的要求逻辑地址转换为物理地址,“一个逻辑地址是一个段标识符加上一个相对地址在指定段内的偏移量。,表示如[段标识符:段内偏移],也就是说上例中的0x08111111应该表示为[A的代码段标识符:0x08111111],这样更完整”

线性地址或也称为虚拟地址

类似于逻辑地址,也是一个虚地址。如果逻辑地址是对应硬件平台段管理的预翻译地址,那么线性地址对应硬件页内存的预翻译地址。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论