免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 11320 | 回复: 24
打印 上一主题 下一主题

关于linux高端内存管理的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-14 18:21 |只看该作者 |倒序浏览
最近内核版关于linux内存方面的大牛很多,所以就打算趁这个机会把自己的疑问提出来,希望大牛们帮忙解惑~~


  假如,按照正常的32位linux内存管理机制,可寻址的4G内存中,用户空间内存空间为3G,内核空间占1G。
      
    这1G的内核空间中采用线性映射的占896M,即这896M的空间其物理地址跟逻辑地址是线性的,两者之差一个偏移量。剩余的128M,有一部分用于vmalloc的动态内存映射,一部分用于永久内存映射,最后一部分用于临时内存映射,这其中每一部分的大小对于给定设备都是固定的,比如永久内核映射区间只有4MB,最多只能映射1024个页面,临时内核映射一般用于专门的处理流程映射。

    比如,实际内存为1G,那么内核可以直接访问的为896MB,剩余的128MB可以通过vmalloc动态映射,或者永久映射区来映射到内核空间中,供内核管理。
    那么,假如内存为2G,内核可以直接访问的空间也为896MB,剩余的1G+128MB也只能通过vmalloc动态映射或永久映射区来进行管理,可是这两个区间的大小也是固定的,那么同时能够映射进内存的页面大小数应该跟1G相同的。
    以此类推,3G,4G的情况是不是都应该相同? 是不是越来越多的物理页需要“抢占”映射资源?

  还有,在linux内核编译选项中可以配置用户空间访问的内存空间为1G,那么4G内存此时应该用户空间占1G,内核占3G。

   这个时候内核的起始逻辑地址应为0x40000000,那么此时内核能够直接线性映射的内存空间有多大,是不是仍未896M,只是可以拥有vmalloc的空间扩大了, 还是线性映射的整个空间都扩大了?

论坛徽章:
0
2 [报告]
发表于 2011-07-14 18:24 |只看该作者
刚有一哥们这样跟我讲的:

  vmalloc 最多只能分128m, 实际上分不到这么多, 其它内存都是用页表+虚拟地址管理的, 用page管理, 确切的说可以用kmalloc/slab分出来用, 当然你也可以直接申请 page 来用。


  可是,还是有疑问,比如通过get_free_pages直接分配高端内存的页面,那么获取的page应该没有对应的逻辑地址,首先应该进行映射,内核中kmap以及kmap_atomic貌似就是完成这个功能,那么这样的话不还是造成多个物理页面同时抢占同一块映射区间吗?

论坛徽章:
0
3 [报告]
发表于 2011-07-14 20:18 |只看该作者
  这次真晕了

    感觉自己已经把问题升级到  系统如何管理内存中的物理页了

   内核空间对于896MB内存的直接线性映射,并不表示说这部分内存的页 896MB/4KB 是只供内核使用的,那么这些页就必须是用户空间、内核空间直接使用的,那么这样一来系统是如何管理这些页的呢。

   考虑到这个问题的时候,那么对于内核高端内存又有什么影响呢,高端内存的页不能直接在内核空间使用,那么能直接映射到用户空间吗?

   感觉自己这会思维已经不正常了。。。  

论坛徽章:
0
4 [报告]
发表于 2011-07-14 22:26 |只看该作者
从你的帖子中可以看出,你认真的思考过了这个问题,其实当时我也困惑过这个问题,下面对你的问题进行回答:
以此类推,3G,4G的情况是不是都应该相同?  是不是越来越多的物理页需要“抢占”映射资源? 确实是相同的,具体可以参见ULK这本书上讲了这种情况下的内核页表
这个时候内核的起始逻辑地址应为0x40000000,那么此时内核能够直接线性映射的内存空间有多大,是不是仍未896M,只是可以拥有vmalloc的空间扩大了, 还是线性映射的整个空间都扩大了?
这个我到没有注意过,但是我看一下代码,在初始化内核页表的时候是通过一个宏,这个宏应该是根据具体的编译选项来的,如果这个时候内核展了3G,那么,内核占用的空间就不是896M,而是7/8 *3G的内容

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2011-07-15 09:49 |只看该作者
可是,还是有疑问,比如通过get_free_pages直接分配高端内存的页面,那么获取的page应该没有对应的逻辑地址,首先应该进行映射,内核中kmap以及kmap_atomic貌似就是完成这个功能,那么这样的话不还是造成多个物理页面同时抢占同一块映射区间吗?

最近也在看 MM   说一下个人的理解。

不同的映射使用的是不同的线性区域。比如 vmalloc 的分配的线性区域是不会和固定映射内存的线性区域重叠的,也不回永久映射区域重叠的。

因此,应该不会存在多个物理页面抢占同一个映射区间。

个人理解,不当之处,请大家指正

论坛徽章:
0
6 [报告]
发表于 2011-07-15 16:53 |只看该作者
回复 5# Godbach


    vmalloc的线性映射区跟NORMAOL的线性地址不同,但我所说的抢占的意思是,假如vmalloc分配的地址全部位于高端内存(实际上并不这样),那么在主机2G内存的情况下,高端内存就是896MB-2G的范围,但是vmalloc最大映射的地址范围一共就128MB,如果内核需要访问更多的高端内存,但是会由于映射的地址有限而产生类似抢占的效果。
   我是这样理解的,不晓得对不对。


   另外,我还有几个问题想请教下:

   1.内核在初始化的过程中会为内核建立好页目录表,建立物理地址到虚拟地址的固定线性映射,[0--len]::[3G--3G+len](len <=896MB),那么可不可以这样理解,对于内核空间给定的线性地址,比如0xc1234567,它就必须映射到实际的物理地址0x1234567处,但是系统却不能保证包含此地址的物理页一定能够分配给内核空间使用,因为这个物理页可能恰好分配给了用户空间,那么这种情况下对于内核空间中给定地址的访问就会失败,接下来会发生什么呢? oops,还是会有一系列的页切换去保证内核空间分配到该页?

    2. get_free_pages函数用于分配物理页,并且返回逻辑地址,其中的分配物理页是通过alloc_pages函数调用实现,页地址到逻辑地址的转换是通过page_address函数实现,在page_address函数中直接返回page->virtual,返回物理页的虚拟地址,但是我没有找到这个值是在什么地方赋值的。
     物理页的分配是从free_list中选择的空闲页,这个页结构在mem_map数组中应该只有物理地址才对,因为用户空间、内核空间都会用到这些页,虚拟地址是在建立映射时分配的,那么对于get_free_pages函数中是怎样直接获取逻辑地址的,难道直接加上0xc000000的偏移?

   谢谢。

论坛徽章:
0
7 [报告]
发表于 2011-07-16 23:00 |只看该作者
本帖最后由 xs3c 于 2011-07-16 23:05 编辑

回复 6# luoyan_xy

为什么会出现内核空间与用户空间使用相同的物理页面呢?我的理解 内核大小本身占用的页面那部分已经标记正在使用,用户空间肯定不能使用了,剩下的页面都是由伙伴系统统一管理。所以不会现这种情况,个人理解 有个有误,希望大侠指正

论坛徽章:
0
8 [报告]
发表于 2011-07-28 15:44 |只看该作者
个人认为大家先搞清楚什么是物理地址,什么是虚拟地址,
然后再想内存映射的问题,也许能容易些。

论坛徽章:
0
9 [报告]
发表于 2011-07-30 18:21 |只看该作者
刚听过这部分内容,还没有时间整理好,希望赶紧找时间整理下。

论坛徽章:
0
10 [报告]
发表于 2011-07-31 10:22 |只看该作者
回复  Godbach


    vmalloc的线性映射区跟NORMAOL的线性地址不同,但我所说的抢占的意思是,假如vmal ...
luoyan_xy 发表于 2011-07-15 16:53



    对于你说的第一个问题,我的理解是:内核空间分配地址都是先找到空闲的page,再映射到内核地址空间,而那0-896M物理内存跟内核地址空间的映射关系是写死的,所以某个page被用户空间使用了以后,被映射到用户空间,那他对应的内核地址就不会被其他page映射,也就是内核不会访问到那个地址。如果因为bug或其他异常情况导致内核访问那个地址,也应该是产生一个内核缺页中断吧,至于中断后如何处理,就没有研究了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP