为什么64位机指针只用48个位？
因为如果全用上的话，地址翻译开销太大，并且浪费内存，TLB/cache的尺寸也跟着增大。不考虑大页的情况下，每一级4K大小的页表可以保存512项（每项8字节，64位，4096/8=512），对于一个48位地址来说，低4K地址（12位）是页内偏移，之后每多一级页表，地址范围增加9位，所以可以得到下面的规律：一级页表：9+12=21位地址，最大地址2MB二级页表：9+9+12=30位地址，最大地址1GB三级页表：9+9+9+12=39位地址，最大地址512GB四级页表：9+9+9+9+12=48位地址，最大地址256TB五级页表：9+9+9+9+9+12=57位地址，最大地址128PB六级页表：9+9+9+9+9+9+12=66位地址，超过64位，最大地址128EB对于内存来说，三级页表不太够用（服务器内存有可能上TB），四级页表用不完（民用的最大服务器内存貌似在几十TB左右），所以用四级页表（48位，最大256TB）刚好，五级页表就完全没必要了。如果用满64位地址，需要六级页表，地址翻译多两次，访问内存的效率就会降低（多做两次地址加法），内存消耗也多了8K（多两级页表）。CPU的各级缓存的地址索引项都要增加，访问缓存的效率也会降低（记得在网上看过一个文章，说CPU的L1cache增大，导致访问性能下降）。所以用满4级页表（48位地址），是64位环境下，针对现在的软硬件场景的一个最合适的取值。