楼主,我觉得这里需要区分两个问题:
(1)32位下进程的寻址空间是4G,那么程序超过4G以后,如何将4G以上的物理内存映射到4G大小的物理内存上?即 程序大小超过内存大小。
(2)32位下进程的寻址空间是4G,但是我的物理内存是8G、16G或者32G的情况下,程序是否可以利用超过4G以上的内存部分?即32下进程如何映射4G以上的内存。
首先我们回顾操作系统的内存管理历程,刚开始计算机的程序和内存都比较小,所以基本上都是进程直接映射到物理内存上。
随着时间的发展,软件急剧膨胀,软件大小的增速远超物理内存的增速,于是有了把程序的进程寻址空间进行隔离,用虚拟地址映射到内存物理地址上,实现不同进程的地址空间映射互不干扰。
再后来,发现软件实在是太大,没有办法把进程的所有部分全部映射到物理内存上,于是采用页表记录映射关系,有了内存映射页面的换入和换出机制。
但是对于32bit的系统,由于系统寻址空间的限制,虚拟地址只能局限于4G,不可能超过4G。
这里有内存扩展机制(PAE),详细内容见 linux内核高端内存寻址。