2024年5月1日发(作者:)

物理地址和虚拟地址

参考如下

CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分,如果CPU没

有MMUMemory Management Unit,内存管理单元,或者有MMU但没有启用,

CPU核在取指令或访问内存时发出的地址将直接传到CPU芯片的外部地址引脚上,直接

被内存芯片以下称为物理内存,以便与虚拟内存区分接收,这称为物理地址Physical

Address,以下简称PA,如下图所示。

物理地址示意图

如果CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU的

地址称为虚拟地址Virtual Address,以下简称VA,而MMU将这个地址翻译成另一个

地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址,如下图所示

[1]。

虚拟地址示意图

MMU将虚拟地址映射到物理地址是以页Page为单位的,对于32位CPU通常一页

为4K。例如,虚拟地址0xb700 1000~0xb700 1fff是一个页,可能被MMU映射到物

理地址0x2000~0x2fff,物理内存中的一个物理页面也称为一个页框Page Frame。

内核也不能直接访问物理地址.但因为内核的虚拟地址和物理地址之间只是一个差值

0xc0000000的区别,所以从物理地址求虚拟地址或从虚拟地址求物理地址很容易,+-这个

差就行了

物理地址physical address

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

——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直

接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量

逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提

供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与地址总线相对应”,是

更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对

应,也是可以接受的。也许错误的理解更利于形而上的抽像。

虚拟内存virtual memory

这是对整个内存不要与机器上插那条对上号的抽像描述。它是相对于物理内存来讲的,

可以直接理解成“不直实的”,“假的”内存,例如,一个0x08000000内存地址,它

并不对就物理地址上那个大数组中0x08000000 - 1那个地址元素;

之所以是这样,是因为现代操作系统都提供了一种内存管理的抽像,即虚拟内存

virtual memory。进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”

成真正的物理地址。这个“转换”,是所有问题讨论的关键。

有了这样的抽像,一个程序,就可以使用比真实物理地址大得多的地址空间。拆东墙,

补西墙,银行也是这样子做的,甚至多个进程可以使用相同的地址。不奇怪,因为转换后

的物理地址并非相同的。

——可以把连接后的程序反编译看一下,发现连接器已经为程序分配了一个地址,例

如,要调用某个函数A,代码不是call A,而是call 0x ,也就是说,函数A

的地址已经被定下来了。没有这样的“转换”,没有虚拟地址的概念,这样做是根本行不

通的。

打住了,这个问题再说下去,就收不住了。

逻辑地址logical address

Intel为了兼容,将远古时代的段式内存管理方式保留了下来。逻辑地址指的是机器

语言指令中,用来指定一个操作数或者是一条指令的地址。以上例,我们说的连接器为A

分配的0x08111111这个地址就是逻辑地址。

——不过不好意思,这样说,好像又违背了Intel中段式管理中,对逻辑地址要求,

“一个逻辑地址,是由一个段标识符加上一个指定段内相对地址的偏移量,表示为 [段标

识符:段内偏移量],也就是说,上例中那个0x08111111,应该表示为[A的代码段标识

符: 0x08111111],这样,才完整一些”

线性地址linear address或也叫虚拟地址virtual address

跟逻辑地址类似,它也是一个不真实的地址,如果逻辑地址是对应的硬件平台段式管

理转换前地址的话,那么线性地址则对应了硬件页式内存的转换前地址。

-------------------------------------------------------------

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

个逻辑地址其实是段内偏移量,这个一定要理解,CPU要利用其段式内存管理单元,

先将为个逻辑地址转换成一个线程地址,再利用其页式内存管理单元,转换为最终物理地

址。

这样做两次转换,的确是非常麻烦而且没有必要的,因为直接可以把线性地址抽像给

进程。之所以这样冗余,Intel完全是为了兼容而已。

物理地址就是,机器内主存的地址,包括RAM和ROM

逻辑地址就是,程序运行在内存中,使用的地址。

虚拟地址就是,cpu支持的内存空间远远大于机器主存的大小,这些多出来的空间对

于程序来说是可以用的,这个时候的所有地址都称为虚拟地址

物理地址:最小系统下的存储器的实际地址,一般只是由CPU内存控制器地址线可

以管理的容量为最大地址,而实际上这个容量由地址产生的远大于实际存在的容量;实际

的存储器容量所需要的地址内存控制器管理的容量;它的大小一般由芯片决定

逻辑地址:相对程序员而言使用的地址,或说程序无需知道具体的实际地址管理数,

而只要在系统操作允许范围内使用就行了这时使用的是一种算法控制下的地址,实际上它

只是借用地址概念产生的程序运行模式,它所要说明的是方便,也就是一个线性的最好的

程序指令排列方式。它的大小一般由操作系统决定

虚拟地址:将具有存储功能的所有存储器不仅仅是最小系统概念下的,进行“统一”

编址,而不考虑存储器之间的差异快慢等,这时的地址是一个比逻辑地址理会数学化的编

号地址,它的大小等往往由应用程序决定

感谢您的阅读,祝您生活愉快。