首页 > 32位段页模式,下如果程序分4个段,那么程序最大有16G内存空间?

32位段页模式,下如果程序分4个段,那么程序最大有16G内存空间?

学习段模式的时候想到,32位段页模式下一个段最大为4G,如果程序分n个段,那么整个程序最大可以有4*n G的空间?那一个程序有4G虚拟地址空间的说法,是在纯分页模式下才成立?
平时写的hello world之类的小程序是分几个段呢?


原则上说是这样的,但是还受物理地址限制,如果物理地址是32位的,那么搞再多段也没用。32位机器为了扩展4g以上内存,intel扩展了物理地址,可以使用36位,即总共64G内存。用16个段就可以访问。
但是目前操作系统为了方便,都把段基址设置成0,因此一个进程只能使用4G空间。要使用超过4G空间,需要操作系统的mmap,或者使用更多的进程。
程序的段可以分很多个,常见的.text,.data,.bss。但这个跟操作系统的段关系不大,操作系统一般只给应用程序2个段,一个.text,代码段,其他数据段包括堆栈都用一个。


32bit应用的地址空间就是4G, 没办法突破的.
平坦内存模式下, 所有的段都共用一个完整的4G地址空间, 但是各个段之间是没有交集的.
只有在老的分段内存模式下, 段的个数才跟寻址空间有关系. 当时一个段只能寻址64KB, 如果想要突破64KB, 就需要用多个段, 而那时的16bit CPU, 实际上有20位的地址总线, 所以可以通过16个段来支持完整的1M地址空间.

一个小程序基本上就是.text, .data, .rodata几个段就可以运行了. 如果有调试信息之类的, 段会更多一些.
具体可以看, http://blog.csdn.net/boozergj/article/details/5753997

PS: 楼下仁兄回答了PAE技术把CPU的32位寻址空间扩大到36位. 可惜这个技术只是给操作系统用的, 操作系统可以利用这一技术支持更多的内存, 支持更多的进程, 但是单个进程的地址空间还是32bit.

【热门文章】
【热门文章】