我有一个关于Linux的简单问题。
让我们假设我们有1GB的RAM。我读到了这个1GB内存
1GB RAM本身分为高内存和低内存 高内存为128MB,低内存为896MB(两者均为1GB)
我的问题是映射到RAM的0x0GB到3GB数据在哪里
1)用户空间为3GB - 它驻留在RAM中的哪个位置?如果是896 MB +高 已占据整个RAM。 Userspace 3GB RAM的空间在哪里?
4GB +---------------+-------------+
| 128MB | |
+---------------+ <------+ |->|------------+
| 896MB | | | 128MB |
3GB +---------------+ <--+ +------>+------------+
| | | | 896 MB |
| ///// | +---------->+------------+
| |
0GB +---------------+
答案 0 :(得分:2)
你混淆了不同的概念。 [0-3GB] + [3-4GB]区域位于虚拟地址空间(特定布局非常特定于i386 [即x86 32位],顺便说一句。)
如果您有1GB的RAM,则可通过虚拟地址空间映射可用的物理内存。有可能(并且在许多情况下,可能)对同一物理内存页面进行多次映射。
默认情况下,在i386中,低896MB的RAM直接映射到内核虚拟地址空间,从3GB标记(0xc0000000)开始。内核实际上为其代码和数据区域使用了最低几兆字节。然后将其余大部分放入分配池中,随后可以将其分配给内核或用户进程使用。
因此,用户虚拟地址空间使用一些相同的物理内存。物理页面根据进程的需要逐个分配,并映射到低3GB的虚拟空间。每次有上下文切换时,此映射都会更改。也就是说,进程A的虚拟地址空间映射不同于进程B的页面集 - 除了内核部分(高于0xc0000000)不会改变。
实际执行代码时,程序中使用的每个代码或数据地址都是虚拟地址。虚拟地址按页面表转换为硬件中的物理地址。内核设置并完全控制页表。