Architecture 理解虚拟地址和虚拟地址空间

Architecture 理解虚拟地址和虚拟地址空间,architecture,operating-system,virtual,memory-address,virtual-address-space,Architecture,Operating System,Virtual,Memory Address,Virtual Address Space,我读到,“当一个程序执行如下指令:MOV REG,1000,它这样做是为了将内存地址1000的内容复制到REG。地址可以使用索引、基址寄存器、段寄存器和其他方式生成 这些程序生成的地址称为虚拟地址,并构成虚拟地址空间。” 谁能给我解释一下(这些程序生成的地址称为虚拟地址)是什么意思?程序和数据以数字形式存储在存储单元中。每个存储单元都有一个唯一的编号,称为其地址。表示有效地址的数字范围称为地址空间 当程序运行时,CPU从内存读取数据并将结果写回内存。CPU通过指定读或写操作所针对的内存单元的地址

我读到,“当一个程序执行如下指令:
MOV REG,1000
,它这样做是为了将内存地址1000的内容复制到REG。地址可以使用索引、基址寄存器、段寄存器和其他方式生成

这些程序生成的地址称为虚拟地址,并构成虚拟地址空间。”


谁能给我解释一下(这些程序生成的地址称为虚拟地址)是什么意思?

程序和数据以数字形式存储在存储单元中。每个存储单元都有一个唯一的编号,称为其地址。表示有效地址的数字范围称为地址空间

当程序运行时,CPU从内存读取数据并将结果写回内存。CPU通过指定读或写操作所针对的内存单元的地址,将所需位置传送给内存

CPU可以通过多种方式找到地址(记住,地址只是一个数字)。表示地址的数字可以在寄存器中,可以存储在另一个内存位置,可以通过向寄存器添加或减去偏移量来计算,等等。在所有情况下,编译后的程序都会指示CPU如何找到(或生成)它需要读取或写入的地址

现代体系结构允许多个程序执行,就好像它们拥有整个逻辑地址空间一样。换句话说,多个程序可以在同一地址写入内存位置,而无需跨过其他程序的结果。这是通过虚拟化地址空间来实现的:假设程序A和B在0x1000处生成一个写入内存的位置。在操作系统的帮助下,CPU可以对地址执行额外的调整,并将其映射到程序A的物理地址0x60001000,以及程序B的物理地址0x5F001000。这两个程序都认为它们写入了0x1000处的位置,因为它们在虚拟地址空间中运行。他们的内存模型是一个连续块,从0开始一直到0x00010000000(假设您的系统有4GiB内存可供进程使用)。但是,这种模型之所以有效,是因为CPU额外将其逻辑地址转换为物理地址,在运行程序的过程中,这些地址会根据需要进行分配和删除


因为代表地址的同一个数字对程序和CPU来说意味着不同的东西,所以程序的地址空间称为虚拟,CPU的地址空间称为物理。

当程序访问内存时,它不知道或不关心支持地址的物理内存存储在哪里。它知道这取决于操作系统和硬件协同工作来映射和定位正确的物理地址,从而提供对所需数据的访问。因此,我们将程序用来访问内存的地址称为虚拟地址。虚拟地址由两部分组成;页面及其偏移量。

在您的示例中,0x1000是程序生成的地址?@program-o-steve是的,它是程序生成的地址。请注意,程序如何生成该地址并不重要:它可以是静态变量的地址、地址0x1000处数组的元素0、地址0x0FE0处数组的元素32,等等。但我问题中的语句表示程序生成的地址是虚拟地址。0x1000似乎不是虚拟的address@program-o-steve当然是虚拟的:它仅对程序是0x1000。在我的示例中,虚拟0x1000单元的物理(硬件)地址对于程序A是0x60001000,对于程序B是0x5F001000。您的程序认为它正在写入0x1000,但硬件写入到一个完全不同的地址。@dasblinkenlight“CPU可以通过多种方式找到地址”。地址总线是否有责任指定一个地址,以便数据总线可以读写该地址?