了解虚拟地址和虚拟地址空间

pro*_*eve 10 architecture virtual operating-system virtual-address-space memory-address

我读到,"当程序执行如下指令时MOV REG,1000,它会将内存地址1000的内容复制到REG.可以使用索引,基址寄存器,段寄存器和其他方式生成地址.

这些程序生成的地址称为虚拟地址,形成虚拟地址空间."

任何人都可以请解释一下,它是什么(这些程序生成的地址称为虚拟地址)是什么意思?

das*_*ght 32

程序和数据作为数字存储在存储器单元中.每个存储器单元具有唯一的编号,称为其地址.表示有效地址的数字范围称为地址空间.

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

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

现代架构允许多个程序执行,就好像它们拥有整个逻辑地址空间一样.换句话说,几个程序可以写入同一地址的内存位置,而不会踩到彼此的结果.这是通过虚拟化地址空间来完成的:假设程序A和B生成写入内存位置0x1000.在操作系统的帮助下,CPU可以对地址执行额外调整,并将其映射到程序A的物理地址 0x60001000,以及程序B的0x5F001000.两个程序都认为它们写入0x1000的位置,因为它们运行在虚拟地址空间中.他们的内存模型是一个连续的块,从0开始,一直持续到0x000100000000(假设你的系统有4GiB的内存可供进程使用).但是这种模式的工作原理只是因为CPU还将其逻辑地址转换为物理地址,这些地址在运行程序的过程中根据需要进行分配和取走.

因为表示地址的相同数字对于程序和CPU意味着不同的东西,所以程序的地址空间称为虚拟,而CPU的地址空间称为物理.

  • @ program-o-steve当然它是虚拟的:它只对程序是0x1000.我的示例中虚拟0x1000单元的物理(硬件)地址对于程序A为0x60001000,对于程序B为0x5F001000.您的程序*认为*它写入0x1000,但硬件写入完全不同的地址. (3认同)