为什么用windbg看!address显示出的Free是128T大小?

总是被朋友问,用 !address -summary 显示出上面的 Free ≈ 128T 到底是什么意思?我的空闲内存不可能有这么大,不管怎么说,先上命令。.

0:009> !address -summary

--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free                                     58     7ffe`d6410000 ( 127.995 TB)          100.00%
<unknown>                                65        1`22935000 (   4.540 GB)  97.59%    0.00%
MappedFile                               15        0`031e9000 (  49.910 MB)   1.05%    0.00%
Image                                   194        0`02d03000 (  45.012 MB)   0.94%    0.00%
Stack                                    30        0`00dc0000 (  13.750 MB)   0.29%    0.00%
Heap                                     17        0`0040d000 (   4.051 MB)   0.09%    0.00%
Other                                     8        0`001dd000 (   1.863 MB)   0.04%    0.00%
TEB                                      10        0`00014000 (  80.000 kB)   0.00%    0.00%
PEB                                       1        0`00001000 (   4.000 kB)   0.00%    0.00%

--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_PRIVATE                             124        1`23b09000 (   4.558 GB)  97.97%    0.00%
MEM_MAPPED                               22        0`033d4000 (  51.828 MB)   1.09%    0.00%
MEM_IMAGE                               194        0`02d03000 (  45.012 MB)   0.94%    0.00%

--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_FREE                                 58     7ffe`d6410000 ( 127.995 TB)          100.00%
MEM_RESERVE                              55        1`24c09000 (   4.574 GB)  98.32%    0.00%
MEM_COMMIT                              285        0`04fd7000 (  79.840 MB)   1.68%    0.00%

--- Protect Summary (for commit) - RgnCount ----------- Total Size -------- %ofBusy %ofTotal
PAGE_READONLY                           108        0`02906000 (  41.023 MB)   0.86%    0.00%
PAGE_EXECUTE_READ                        32        0`020b4000 (  32.703 MB)   0.69%    0.00%
PAGE_READWRITE                          101        0`005aa000 (   5.664 MB)   0.12%    0.00%
PAGE_WRITECOPY                           24        0`0002b000 ( 172.000 kB)   0.00%    0.00%
PAGE_EXECUTE_READWRITE                   10        0`00028000 ( 160.000 kB)   0.00%    0.00%
PAGE_READWRITE | PAGE_GUARD              10        0`00020000 ( 128.000 kB)   0.00%    0.00%

--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
Free                                      1`40006000     7ff3`bde7a000 ( 127.952 TB)
<unknown>                              7ff4`fdf80000        1`00020000 (   4.000 GB)
MappedFile                                0`22fc0000        0`01a07000 (  26.027 MB)
Image                                  7ffc`16c04000        0`008ca000 (   8.789 MB)
Stack                                     0`006d0000        0`0017c000 (   1.484 MB)
Heap                                      0`22c3c000        0`00101000 (   1.004 MB)
Other                                     0`00d50000        0`00181000 (   1.504 MB)
TEB                                       0`00270000        0`00002000 (   8.000 kB)
PEB                                       0`0026f000        0`00001000 (   4.000 kB)

从上面输出看,当前空闲空间是Free=127.995 T ,那这是什么意思呢?这要从 地址总线 说起, CPU 从内存中拿数据需要走 地址总线,1个地址线可以传递 1/0 两个状态,16根总线就可以同时传递16个 1/0 状态,也就可以拥有 2 的 16 个地址个数,地址范围是 0x00000000 - 0xffffffff,比如 0x005aa000 就是这范围中的一个。

有了这个基础,再回过头来看下,目前很多的机器,数据总线是 64 根,但地址总线只有 48 根,能表示的地址个数就是 2 的 48次方,也就是 256T,当然这是理论上的最大可寻址空间,而用户区大概占用一半,也就是 128T,不过这已经足够覆盖现如今大家用的 内存条大小  了。