use*_*465 3 memory operating-system memory-management process
UNIX,Linux和Windows中单个进程的最大内存量是多少?怎么计算?4 GB RAM的用户地址空间和内核地址空间是多少?
How much user address space and kernel address space for 4 GB of RAM?
一个过程的地址空间分为两部分,
用户空间:在标准的32位x86_64架构上,最大可寻址存储器4GB的地址来自0x00000000于0xbfffffff= (3GB)表示代码,数据段.当用户进程在用户或内核模式下执行时,可以解决该区域.
内核空间:类似地,0xc0000000to 0xffffffff= (1GB)的地址用于内核的虚拟地址空间,只能在进程在内核模式下执行时才能解决.
分割的特定地址空间x86由值决定PAGE_OFFSET.参考Linux 3.11.1v page_32_types.h和page_64_types.h,页面偏移定义如下,
#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
其中Kconfig定义了一个默认值,default 0xC0000000也可以使用其他地址拆分选项.
同样对于64位,
#define __PAGE_OFFSET _AC(0xffff880000000000, UL).
由于巨大的地址空间,64位架构3G/ 1G拆分不再存在.根据源代码,最新的Linux版本已将上述偏移量作为偏移量.
当我看到64位x86_64架构时,32位进程可以拥有整个4GB用户地址空间,内核将保存上面的地址范围4GB.有趣的是现代的64位CPU x86_64的不是所有的地址线启用(或地址总线是不是足够大)向我们提供2^64= 16 exabytes虚拟地址空间.或许AMD64/ x86架构分别启用48/ 42较低位,从而导致2^48= 256TB/ 2^42= 4TB地址空间.现在这确实提高了大量RAM的性能,同时出现了如何通过操作系统限制有效管理它的问题.