【发布时间】:2014-06-29 22:39:25
【问题描述】:
假设我们用 C 语言编写一个程序并打印程序中声明的变量之一的地址,打印在屏幕上的地址是变量的虚拟地址还是物理地址? 如果是虚拟地址,为什么它仍然与物理内存的位范围相同?例如。对于 32 位机器,如果它返回 0x833CA23E。
【问题讨论】:
-
C 和 C++ 编程语言都不包含任何“虚拟”或“物理”内存的概念。只有“记忆”。该问题无法用任何一种语言回答。
-
您会发现物理地址和虚拟地址相同的唯一机器是根本没有虚拟内存(和内存管理单元)的系统,例如许多嵌入式系统。例如,ucLinux 是设计用于在这些平台上运行的 Linux 版本。 FreeRTOS 是一个微型操作系统(可以将其降至 8kB 左右),不支持虚拟内存。
-
另外,在现代系统中,机器的“位数”是虚拟地址中的位数。物理地址可能没有那么多位(例如,在 64 位机器上,实际连接的物理地址可能只有 40 或 48 位;忽略高阶物理地址位)。在旧架构中,它描述了内部数据寄存器的宽度,并且(物理)地址有更多位。例如 8086 是 16 位但有 20 位寻址 (1024k); 6502 是 8 位的,但有 16 位地址 (64k)。
-
@MikeDeSimone:请注意,在硬件层面,当前的 x86-64 也只有 48 位的虚拟地址。
-
是的,但是指针仍然是 8 个字节,而不是 6 个。
标签: c++ c memory virtual-memory