免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 18584 | 回复: 32

VMALLOC_RESERVE 和 896M [复制链接]

论坛徽章:
0
发表于 2006-01-16 13:57 |显示全部楼层
VMALLOC_RESERVE和896M

LINUX 内核虚拟地址空间到物理地址空间一般是固定连续影射的。

假定机器内存为512M,
从3G开始,到3G + 512M 为连续固定影射区。zone_dma, zone_normal为这个区域的。固定影射的VADDR可以直接使用(get a free page, then use pfn_to_virt()等宏定义转换得到vaddr)或用kmalloc等分配. 这样的vaddr的物理页是连续的。得到的地址也一定在固定影射区域内。

如果内存紧张,连续区域无法满足,调用vmalloc分配是必须的,因为它可以将物理不连续的空间组合后分配,所以更能满足分配要求。

但vmalloc分配的vaddr一定不能与固定影射区域的vaddr重合。因为vaddr到物理页的影射同时只能唯一。所以vmalloc得到的vaddr要在3G + 512m 以上才可以。也就是从VMALLOC_START开始分配。 VMALLOC_START比连续固定影射区大最大vaddr地址还多8-16M(2*VMALLOC_OFFSET)--有个鬼公式在

#define VMALLOC_OFFSET  8*1024
#define VMALLOC_START  (high_memory - 2*VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)

high_memory 就是固定影射区域最高处。

空开8-16M做什么? 为了捕获越界的mm_fault.
同样,vmalloc每次得到的VADDR空间中间要留一个PAGE的空(空洞),目的和上面的空开一样。你vmalloc(100)2次,得到的2个地址中间相距8K。
如果连续分配无空洞,那么比如
p1=vmalloc(4096);
p2=vmalloc(4096);
如果p1使用越界到p2中了,也不会mm_falut. 那不容易debug.

下面说明VMALLOC_RESERVE和896M的问题。

上面假设机器物理512M的case. 如果机器有1G物理内存如何是好?那vmalloc()的vaddr是不是要在3G + 1G + 8M 空洞以上分配?超过寻址空间了吗。
这时,4G 下面保留的VMALLOC_RESERVE 128m 就派上用场了。
也就是说如果物理内存超过896M, high_memory也只能在3G + 896地方。可寻址空间最高处要保留VMALLOC_RESREVE 128M给vmalloc用。

所以这128M的VADDR空间是为了vmalloc在物理超过了896M时候使用。如果物理仅仅有512M, 一般使用不到。因为VMALLOC_START很低了。如果vmalloc太多了才会用到。

high_memory在arch/i386/kernel, mm的初始化中设置。根据物理内存大小和VMALLOC_RESERVE得到数值.

所以说那128M仅仅是为了影射1G以上的物理内存的不对的。如果物理内存2G,1G以下的vmalloc也用那空间影射。

看vmalloc分配的东西可以用


  1. show_vmalloc()
  2. {
  3. struct vm_struct **p, *tmp;

  4.     for(p = &vmlist; (tmp = *p); p = &tmp->next) {
  5.        printk("%p %p %d\n", tmp, tmp->addr, tmp->size

  6.    }
  7. }
复制代码


看到。

不全面的地方我还有补充,欢迎讨论

[ 本帖最后由 albcamus 于 2007-6-14 16:36 编辑 ]

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
发表于 2006-01-16 16:52 |显示全部楼层
纠正一下:
2.4.21内核 i386 平台上的定义:
#define VMALLOC_OFFSET  (8*1024*1024)
#define VMALLOC_START   (((unsigned long) high_memory + 2*VMALLOC_OFFSET-1) & \
                                                ~(VMALLOC_OFFSET-1))
#define VMALLOC_VMADDR(x) ((unsigned long)(x))
#if CONFIG_HIGHMEM
# define VMALLOC_END    (PKMAP_BASE-2*PAGE_SIZE)
#else
# define VMALLOC_END    (FIXADDR_START-2*PAGE_SIZE)
#endif


2.6.9内核 i386 平台上的定义:
#define VMALLOC_OFFSET        (8*1024*1024)
#define VMALLOC_START        (((unsigned long) high_memory + vmalloc_earlyreserve + \
                        2*VMALLOC_OFFSET-1) & ~(VMALLOC_OFFSET-1))
#ifdef CONFIG_HIGHMEM
# define VMALLOC_END        (PKMAP_BASE-2*PAGE_SIZE)
#else
# define VMALLOC_END        (FIXADDR_START-2*PAGE_SIZE)
#endif

可以看一下ULK 2nd(中文版) 的图7-7。 英文版就是 Figure 7-7 了
2.6内核的对应 ULK 3rd 的Figure 8-7

[ 本帖最后由 yjh777 于 2006-1-16 17:42 编辑 ]

论坛徽章:
0
发表于 2006-01-16 16:55 |显示全部楼层
to yjh777.

谢谢。我没仔细打字,所以。。。
KMALLOC_RESERVER 应该是VMALLOC_RESERVE

本帖子就是针对你的帖子和几个人的疑问写的。对你的理解是否有帮助?

论坛徽章:
0
发表于 2006-01-16 17:00 |显示全部楼层
to albcamus,

请帮助将题目改了,KMALLOC_RESERVE 应该为VMALLOC_RESERVE

谢谢

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
发表于 2006-01-16 17:02 |显示全部楼层
原帖由 思一克 于 2006-1-16 16:55 发表
to yjh777.

谢谢。我没仔细打字,所以。。。
KMALLOC_RESERVER 应该是VMALLOC_RESERVE

本帖子就是针对你的帖子和几个人的疑问写的。对你的理解是否有帮助?


8错, 解释的很透彻。 谢谢

还有一个问题:就是用户空间程序,可不可以使用高端内存,有几种方法。

论坛徽章:
0
发表于 2006-01-16 17:10 |显示全部楼层
我在看。因为我机器仅仅512M,所以无法实验



还有一个问题:就是用户空间程序,可不可以使用高端内存,有几种方法。”

论坛徽章:
0
发表于 2006-01-16 17:37 |显示全部楼层
我印象里用户空间是可以使用高端内存的, 只不过不可能超过4G的空间范围 per 进程。
至于如何为用户进程分配高端内存则不懂, 这两天补一下VM。
to 思兄:那个公式也有笔误吗? 我不确定,还是您自个儿编辑一下吧, 我怕编辑错了

论坛徽章:
0
发表于 2006-01-16 17:54 |显示全部楼层
用户空间当然可以使用了,而且是正常的使用,内核在分配那些不经常使用的内存时,都用高端内存空间(如果有),所谓不经常使用是相对来说的,比如内核的一些数据结构就属于经常使用的,而用户的一些数据就属于不经常使用的。

用户在启动一个应用程序时,是需要内存的,而每个应用程序都有3G的线性地址,给这些地址映射页表时就可以直接使用高端内存。

而且还要纠正一点的是:那128M内存的功能不仅仅是用在这些地方的,如果你要加载一个设备,而这个设备需要映射内存到内核中,它也需要使用这段线性地址空间来完成,否则内核就不能访问设备上的内存空间了。

论坛徽章:
0
发表于 2006-01-16 18:40 |显示全部楼层
>> 那128M内存的功能不仅仅是用在这些地方的,如果你要加载一个设备,而这个设备需要映射内存到内核中,它也需要使用这段线性地址空间来完成,否则内核就不能访问设备上的内存空间了。

这个曾经在某个版本的内核代码的__VMALLOC_RESERVE宏的注释中见过,呵呵,可是现在在2.6.14找不到了

论坛徽章:
0
发表于 2006-01-16 19:21 |显示全部楼层
那 能告诉我现在的那些内存是怎么映射的吗?它不会不需要线性地址就可以被使用了吧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP