虚拟内存或物理内存
Virtual Memory or Physical Memory
假设我们用C语言写一个程序,输出程序中声明的一个变量的地址,打印在屏幕上的地址是该变量的虚拟地址还是物理地址?如果它是虚拟地址,为什么它仍然具有与物理内存的位范围相同的范围?如。如果它返回0x833CA23E,
地址将是虚拟内存中的虚拟地址,因为应用程序对不了解物理内存。这是由内核和MMU隐藏的
我不确定你所说的相同的"位范围"是什么意思。如果您有一个32位地址空间,它将跨越整个32位空间,而不管您有多少物理内存量。64位也一样。
在大多数典型情况下(Windows, Linux等),它将是一个虚拟地址。
在Linux和Windows等典型情况下,虚拟地址和物理地址通常都是32位,因此在相同范围内的数字是不可避免的。如果可以分配超过4gb的内存,那么当/如果您这样做时,您最终会得到大于32位的地址——但是除非您采取特殊步骤,否则默认情况下您将获得32位地址。
当你在32位操作系统下使用超过4gb的内存时,你通常是通过一些特殊的API来实现的,比如Windows的地址窗口扩展。使用这些,您可以访问超过4gb的RAM, 但是这不是默认情况下会发生的事情,甚至接近可移植的代码。
一些(版本)的操作系统也使用英特尔的物理地址扩展(PAE)给系统作为一个整体访问超过4 GB的内存,但是即使这些正在使用,任何一个进程运行在系统仍局限于寻址4 GB(也就是说,PAE,你可以有一个4 GB/过程的限制,而旧系统有一个4 GB的限制,根据需要划分之间的过程)。
多数情况下为32位虚拟地址。
如果您的操作系统支持分页,那么它将是虚拟地址。它可以通过分页映射到相同的物理地址。Linux和Windows做分页。
另一件重要的事情是架构。在Intel x86 32位系统上,它将是32位地址。地址的前10位将用于获取页表。第二个10位将用于从所选页表中获取页。最后12位将给出该页面的实际物理地址。
我希望它能回答你的问题。
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- 为什么我只能在 4 GB 的虚拟内存空间上分配 2 GB?
- AWS pandas 安装出现错误:虚拟内存已耗尽:无法分配内存
- 如何判断虚拟内存页是否已锁定
- 如何使用一个 VirtualFree 调用删除多个相邻的虚拟内存分配?
- Windows 32 位 mfc 应用程序的虚拟内存中的地址
- 如何将x64机器代码写入虚拟内存并在C++中为Windows执行
- 读取虚拟内存时C++缓冲区溢出
- 在 Linux C++ 中获取虚拟内存最大映射计数
- GlobalMemoryStatusEx() 提供的总虚拟内存为 127 TB
- 在虚拟内存中分配大型类C
- 程序C++中的虚拟内存大小增加
- CC1PLUS:虚拟内存耗尽
- Linux的VirtualQueryEx替代方案-如何获得另一个进程的虚拟内存范围
- 在Linux中,多个进程使用文件指针读取文件时使用的共享虚拟内存
- 我已经将虚拟内存设置为20GB,但由于内存不足,代码仍然无法工作
- C++/Win32 在虚拟内存中创建文件
- 优化数据结构,使其充分利用虚拟内存
- 如何知道应用程序中可用的虚拟内存
- 虚拟内存或物理内存