13 12
发新话题
打印

【求助】Linux下用mmap映射内存大小有限制么?

【求助】Linux下用mmap映射内存大小有限制么?

我的程序里一个char型目的指针,用mmap映射分配120K的内存,然后把源指针的数据用memcpy复制给目的指针,操作成功。但是如果是分配并复制124K或者更大的话,则复制就不能成功。请问,是不是mmap分配内存的大小有限制?应该如何解决?请指点。谢谢。      

TOP

你的文件多大? 什么 error?      
'
梅须逊雪三分白 雪却输梅一段香

TOP

跟文件没关系。我是把数据放在源指针所指的地址中,然后往目的地址里复制。目的地址用mmap分配空间。如果分配的是120K的大小的话,复制以后我把数据读出来一看,跟源数据完全一样。如果目标地址是分配124K或者更多的空间的话,memcpy复制以后,我读出来跟源数据完全不一样,实际上我读出来目的地址的数据全都是FF。在整个操作中,没有任何error,只是最后结果数据跟我的源数据不一样。
2 l4 w- K6 ^2 i5 b( o我做的另外一个测试是,把目的地址用new分配空间,然后memcpy,那么即使超过124K,或者更大,copy都可以成功。所以我不知道mmap分配空间是否有什么限制?      

TOP

为了清楚起见,我贴几条主要的语句:
* i* `. S' ?0 r0 L6 Fvoid *p1 = (void *)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, hDevice, 0);2 W: p- s0 D  Q* n" o
char *pDest = (char *)p1;
7 q* T+ y7 _/ x5 s" Y0 Z7 P2 Wmemcpy (pDest, pSrc, 120*1024);  //pSrc 所指的地址存放了超过120K的源数据
/ W( ]4 x9 X" f6 ^  |& ~3 s基本就是这样一个过程。3 n& b' N3 X3 G
请指点。谢谢      

TOP

怎么会跟文件没关系呢? 你的 hDevice 是什么?      
'
梅须逊雪三分白 雪却输梅一段香

TOP

楼主为什么要用mmap?难道是因为好玩吗,不觉得你的程序表现出什么需要的。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

[QUOTE=flag]楼主为什么要用mmap?难道是因为好玩吗,不觉得你的程序表现出什么需要的。[/QUOTE] ' Z  O" }+ s8 y  K& H/ e' {/ `
to flag:你是不是对这种回答情有独衷?从不直接解决别人的问题,而说些无用的废话。不知道你是怎么判断得出楼主不需要用mmap?可以告诉大家吗?:rolleyes::rolleyes:      

TOP

to elia:这个问题与你的文件句柄(hDevice)有关系,如果这个文件长度小于124K,且它长度是被限制的则会出现这种情况。
& `( g. k2 P* y* \您可以试一下使用匿名文件共享(mmap(NULL,size,PROT_READ|PROT_WRITE,                        MAP_SHARED|MAP_ANONYMOUS,-1,0);),如果还是这种情况,你可以通过“cat /proc/sys/kernel/shmmax”来检查下Linux下默认的共享内存尺寸是否被更改(默认是32M)。如果可以大于124K,则证明与hDevice确有关系。      

TOP

[QUOTE=zigzag.jon]to flag:你是不是对这种回答情有独衷?从不直接解决别人的问题,而说些无用的废话。不知道你是怎么判断得出楼主不需要用mmap?可以告诉大家吗?:rolleyes::rolleyes:[/QUOTE]
  \/ H1 l% {7 ]- v- W8 {3 Z4 J- x6 L我需要更多的信息去判断,从楼主提供的东西里判断出来的,有什么问题?      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

再说了,为什么要直接解决问题?能从问题中找到更多的东西,才不至于浪费啊,不过你对我的处理方式有疑惑没必要在别人的帖子里水,难道这就是合适的方式吗?      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

 13 12
发新话题