想问问大家操作系统虚拟内存这的一个知识,有点迷惑。

想问下大家,对于32位操作系统来说,它的地址位数为32位,所以对应的物理内存最大为4G,但是对于虚拟内存来说,却可以为4G的1.5倍到2倍,同时,一个大于4G的程序也可以运行,它是虚拟内存,可以把一部分逻辑地址先导入内存,但是对于大于4G的程序来说,它的逻辑地址应该是大于32位的啊,那通过页表和只有32位的物理地址怎么进行映射啊。。。。
全部评论
楼主,我觉得这里需要区分两个问题:(1)32位下进程的寻址空间是4G,那么程序超过4G以后,如何将4G以上的物理内存映射到4G大小的物理内存上?即 程序大小超过内存大小。(2)32位下进程的寻址空间是4G,但是我的物理内存是8G、16G或者32G的情况下,程序是否可以利用超过4G以上的内存部分?即32下进程如何映射4G以上的内存。 第一点就是你提出的问题 首先我们回顾操作系统的内存管理历程,刚开始计算机的程序和内存都比较小,所以基本上都是进程直接映射到物理内存上。随着时间的发展,软件急剧膨胀,软件大小的增速远超物理内存的增速,于是有了把程序的进程寻址空间进行隔离,用虚拟地址映射到内存物理地址上,实现不同进程的地址空间映射互不干扰。再后来,发现软件实在是太大,没有办法把进程的所有部分全部映射到物理内存上,于是采用页表记录映射关系,有了内存映射页面的换入和换出机制。但是对于32bit的系统,由于系统寻址空间的限制,虚拟地址只能局限于4G,不可能超过4G。 第二点,32位的系统使用超过4G的内存 这里有内存扩展机制(PAE),详细内容见 linux内核高端内存寻址。
3 回复 分享
发布于 2017-09-02 15:55
好问题,题主把进程地址和MMU给搞错了. 物理地址:如果非扩展(PAE), 则只有4GB RAM. 进程地址空间 : 只有4GB,所以说, 不能有大于4GB内存的程序.(题主的想法是错误的) MMU的地址空间:MMU可以知道所有地址. [Quora](https://www.quora.com/What-will-happen-if-we-use-more-than-4GB-of-memory-in-a-32-bit-system-Will-the-system-be-able-to-use-more-than-4GB-Under-what-conditions-can-a-system-have-more-than-4GB-of-memory) check CSAPP 9.4 "In fact, OS provide a seperate page table, and thus a seperate virtual address space, for each process"
点赞 回复 分享
发布于 2017-09-02 15:35
一个系统的运行内存是寻址能力和内存大小中的较小者,虚拟内存使用的是局部性原理。就算是4g的程序,不是每一个子程序都相关的吧。可以每次都生成新的映射表。
点赞 回复 分享
发布于 2022-03-06 08:54
对于32位操作系统来说,它的地址位数为32位,所以对应的物理内存最大为4G, 这里要区分32位操作系统和32位地址线: 32位操作系统:内存分页机制具有2级页表,所以虚拟地址空间102410244K = 4G空间,当然完全软件配置3级页表表示102410241024*4K = 4T空间 32位地址线:是说soc和内存之间的地址线为32位,也就是说最大可寻物理地址位2^32=4G空间; 但是对于虚拟内存来说,却可以为4G的1.5倍到2倍,同时,一个大于4G的程序也可以运行, 虚拟地址大小的限制条件有两个: CPU和TLB之间的地址线位数,这里具有决定作用,32位对应的虚拟地址空间位2^32 = 4G空间,64位虚拟地址空间则就是2^64...多少来?但这里是最大可访问的虚拟地址空间; 页表的级数,这里soc实际到页表中可以访问的虚拟地址空间:2级4G,3级4T空间 它是虚拟内存,可以把一部分逻辑地址先导入内存,但是对于大于4G的程序来说,它的逻辑地址应该是大于32位的啊,那通过页表和只有32位的物理地址怎么进行映射啊。。。。 通过上面分析可知:CPU和操作系统任意一个是32位就会把虚拟地址空间限制在4G上,故而不能允许4G以上的程序; 还有一点需要说明,应用程序的虚拟地址是编译器来确定的,它会自动优化空间问题,对于32位的时代来说,通常情况下不会超过4G的可寻址虚拟地址空间的 内存管理方面的可以参考这里,有问题可以直接提问,我尽量解答;
点赞 回复 分享
发布于 2017-09-02 16:17
上面有人说到了 如果非扩展(PAE), 则只有4GB RAM。借助于一些工具或技术,是可以突破 4GB的,楼主是想问 如果超出4GB 要如何进行映射寻址吧? 发两个链接供参考: https://www.zhihu.com/question/21008980  可以看看第一个回答。 https://www.zhihu.com/question/23247083  看轮子哥的回答以及评论。 这两个链接里有回答说道: 1. 虽然单个进程能访问的地址空间仍然只有4GB,但操作系统可以把超过4GB的内存分摊给多个不同的任务。 2. 脱离了CPU ,操作系统是做不到这点的。。
点赞 回复 分享
发布于 2017-09-02 15:56
太可怕了!居然有超过4G的程序!
点赞 回复 分享
发布于 2017-09-02 15:38
32位的,虚拟内存地址就是4G空间,物理内存只能用少于等于4G的大小,不然寻不到址。 你说的虚拟内存大于了4G,那就说明是说的64位的系统。采用内存映射,就能把虚拟空间里的逻辑地址,映射到物理内存上的某个地址上了,这样程序的大小大于4G才能实现。
点赞 回复 分享
发布于 2017-09-02 15:20
32位的系统虚拟空间大于4G?这个是哪里说的?
点赞 回复 分享
发布于 2017-09-02 15:20
程序并非是一口气完全载入内存的,所谓的虚拟内存也可以理解为在一段应设在磁盘上的空间,真正的程序载入内存是通过页表进行换入换出的,因此只要需要的内存空间不是同时达到4G,程序理论上是可以执行的。
点赞 回复 分享
发布于 2017-09-02 15:00
看下段页式的内存管理机制
点赞 回复 分享
发布于 2017-09-02 14:50
大于4g的代码 不敢想象 如果你已经确定了这么大的空间 为啥不用64位?
点赞 回复 分享
发布于 2017-09-02 14:50
大于4g的程序。。。动态链接库吧
点赞 回复 分享
发布于 2017-09-02 14:44

相关推荐

评论
点赞
11
分享

创作者周榜

更多
牛客网
牛客企业服务