对于32位Linux操作系统,内存虚拟地址寻址空间为 232 字节=4GB。
然而,64位Linux操作系统下内存虚拟地址寻址空间并不是 264,而是 248 。
因为并不需要 264 这么大的寻址空间,过大空间只会导致资源的浪费。64位Linux一般使用48位来表示virtual虚拟地址空间,36至40位表示physical物理地址。
virtual地址和physical地址之间存在单项映射关系,映射表由CPU内部的MMU内存管理单元管理。
这可通过cat /proc/cpuinfo
命令来查看:
![1458798-52b49c0ee75324e6.jpg](https://i-blog.csdnimg.cn/blog_migrate/43434d56b8281cfc318ad33e0db6ef30.jpeg)
图 cat /proc/cpuinfo 命令执行结果
64位操作系统实际可提供2^48 = 256TB 的virtual寻址空间,其中:
内存地址【0x0000000000000000 ~ 0x00007fffffffffff】 属于用户空间;
内存地址【0xFFFF800000000000 ~ 0xFFFFFFFFFFFFFFFF】 属于内核空间;
这两个区间的特点是第 47 位与 48~63 位相同(若这些位为 0 表示用户空间,否则表示内核空间)。
在用户空间运行的代码,所有指针都是8字节
-
void *
指针占8字节=64位(其中只有低48位有效,第64至48位应始终为0);
基本整数类型长度定义:
-
int
类型占4字节空间; -
long
类型占8字节空间; -
long long
类型也占8字节空间; -
short
= 2字节; -
char
= 1字节; -
size_t
= 8字节; - 4种固定长度的int类型:
int64_t
,int32_t
,int16_t
,int8_t
- 4种固定长度的无符号int类型:
uint64_t
,uint32_t
,uint16_t
,uint8_t