免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: tianhailong
打印 上一主题 下一主题

请教Linux内存管理问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-04-22 12:35 |只看该作者
本帖最后由 tianhailong 于 2010-04-22 12:48 编辑

回复 10# accessory


    明白点了,谢谢
    我觉得还是有些迷惑,假定机器的物理内存是1G,一般情况是没问题的,但是如果极端情况下,内核确实占用了3G-4G的内核空间,那么通过“x- PAGE_OFFSET”映射,确实需要1G的物理内存空间,对吧。在这种情况下,因为用户空间会占映射到一定的物理内存,而内核又通过“x- PAGE_OFFSET”映射到相应的物理内存,那么就有可能有冲突。比如3.5G的地址,映射为物理地址0.5G这个位置,而这个位置可能存放的是用户进程的代码数据。

    还有一点请教,在进程切换时会修改CR3指向相应的PGD,这样每个进程都有自己的页表,那么并发进程多时,这些也表的开销也很大了,这些页表存放在内核空间,极端情况下,内核的1G空间还不够存放所有的页表,这是怎么处理的,谢谢。

论坛徽章:
0
12 [报告]
发表于 2010-04-23 00:41 |只看该作者
本帖最后由 accessory 于 2010-04-23 00:43 编辑

这个问题以前讨论过,可以看看关于HIGH MEMORY的讨论。下面是我的理解,不一定对。最好还是去看书,比如ULK3。

1、当物理内存大于896M的时候,物理内存就没法同时全部被映射到内核的虚拟地址空间了。这时就要开始用到高端内存(HIGH MEMORY).

2、在LINUX中,一个设计思想是所有用到的物理内存都可以在内核中访问到。也就是说,应用程序用到的内存,如果分配了相应的物理内存的话,那么这个内存在内核中也可以被直接访问到。这个就可以推理出,应用程序在使用的那部分物理内存有2个虚拟地址。一个地址是小于0XC0000000的,让应用程序用的。另外一个地址是大于0XC0000000的,让内核来用的。(注意:这部分是我猜的,还没有证实过。哪位知道可以指点下,或者说说怎么做实验来验证)。

这样做的好处是在分配或者释放物理页面的时候,内核可以直接操作那部分页面,比如需要写回到SWAP分区。否则,如果有一部分物理页面只有一个小于0XC0000000的应用态虚拟地址,那么意味着只有在这个应用程序(称为A)在运行的时候,内核才可以访问(比如在释放页面的时候写回那部分内容)那些页面。因为不同程序的页表是不一样的。在另外一个应用程序B运行的时候,谁也无法访问到属于A的那部分页面了。假如在B运行的时候,发现物理内存不够,需要把一些页面写回到SWAP分区。那么这时应用程序A使用的那部分内存就没法进行回收,因为访问不到(假设需要保存A那些内存的内容到SWAP)。如果想回收A的内存,就必须再进行一次进程切换(CONTEXT SWITCH),切换到A,然后回收,然后切换回B。这样做效率会比较低。

这样来看,所有内存都可以在内核中直接访问到是有道理的。

3、虽然内核可以直接访问用户态的内存,这并不表示一定会有冲突。只要访问时小心点就可以了。比如内核知道那些内存是自己用的,哪些是应用程序在用的。不要弄乱就可以了。

论坛徽章:
0
13 [报告]
发表于 2010-04-23 14:51 |只看该作者
回复 12# accessory


    谢谢,说的有道理,针对你说的第二条,交换内存,有一个问题就是:内核可以访问到全部的物理内存地址,那么内核可以实现内存交换,但是在进行交换时必须清楚这个物理内存属于哪个进程(比如A今晨),进而在交换之后,得以修改相应的页表,否则A再次 运行时使用原来的也映射关系,就会出错。

论坛徽章:
0
14 [报告]
发表于 2010-04-24 10:14 |只看该作者
我觉得是要做到上面说的那点。就是个实现问题了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP