在Linux中如何划分64位进程虚拟地址空间?


12

下图显示了如何对32位进程虚拟地址空间进行划分:

在此处输入图片说明

但是,如何划分64位进程虚拟地址空间呢?

Answers:


10

64位x86虚拟内存映射将地址空间分成两部分:下部(最高位设置为0)是用户空间,上部(最高位设置为1)是内核空间。(请注意,x86-64定义了“规范”,“下半部分”和“上半部分”地址,有效位数限制为48或56;有关详细信息,请参阅Wikipedia。)

完整的映射在内核中有详细记录;目前看起来像

========================================================================================
    Start addr    | Offset  |     End addr     |  Size   | VM area description
========================================================================================
                  |         |                  |         |
 0000000000000000 |    0    | 00007fffffffffff |  128 TB | user-space virtual memory
__________________|_________|__________________|_________|______________________________
                  |         |                  |         |
 0000800000000000 | +128 TB | ffff7fffffffffff | ~16M TB | non-canonical
__________________|_________|__________________|_________|______________________________
                  |         |                  |         |
 ffff800000000000 | -128 TB | ffffffffffffffff |  128 TB | kernel-space virtual memory
__________________|_________|__________________|_________|______________________________

具有48位虚拟地址。(56位变量具有相同的结构,在16K PB孔的任一侧具有64 PB的可用地址空间。)

与32位情况不同,“ 64位”内存映射直接反映了硬件约束。


需要说明的是:此限制是由硬件施加的。当前,没有64位处理器实现会在虚拟地址空间的中间留下不可用地址的巨大漏洞。的物理存储器中的CPU是可以地址量也远低于2的64的功率
约翰Myréen

谢谢@Johan,我试图强调这一点。
Stephen Kitt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.