社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 479|回复: 4

[求助] 求助有关mmap和TCP长度受限的问题。感谢

[复制链接]

37

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-2-25 15:59:44 | 显示全部楼层 |阅读模式
求助有关mmap物理内存映射长度受限的问题。感谢
我写了一个简单的物理内存搬移程序从1个arm通过TCP向另1个arm传输物理地址上一定长度的内容。可是现在不知道为什么mmap,send,recv受到了长度的限制。
若只是映射了1次,大概能传输7M的数据,数据量再大接收方系统崩溃,不知道是否是与栈区大小有关,可是我改过了ulimit -s并没有效果。千兆网下速度大约30MB/s
若是映射多次,虽然可以避免系统崩溃,但每次每次只能映射25K的物理内存到虚拟内存中。mmap操作影响速度,千兆网下只有13MB/s。
求教有什么增大映射长度,提高速度的方法。

非常感谢!!!

static int recvBX(int sock, void *buf, int len)
{
        int rvNum=0;
        int total=0;

        while(total<len)
        {
                rvNum=recv(sock, (char*)buf+total, len-total, 0);
                if(rvNum<=0)
                {
                        total=-1;
                        break;
                }
                else
                {
                        total+=rvNum;
                }
                //pthread_delay(2);
        }
        return total;
}

int recv_mem(int sock_connect, char *buffer, char *dst, int xlen, int bsize)
{
        char *mem = 0;
        int fd_mem = 0;
        int nrecv = 0;
        int nsend = 0;
        float time_val = 0;
        float speed = 0;

        //open /dev/mem with read and write mode  
        if((fd_mem = open ("/dev/mem", O_RDWR)) < 0)  
        {
                printf ("open error");
                mem = 0;
                return -1;
        }
        unsigned int crcVal = 0;
        int j = 0;
        int loop = xlen/bsize;
        int remainder = xlen%bsize;
        printf("loop is %d and remainder is 0x%x\n", loop, remainder);

        gettimeofday(&curr_time_1, NULL);

        for(j=0;j<loop;j++)
        {
                //map physical memory bsize bytes  
                mem = mmap (dst+j*bsize, bsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd_mem, 0);
                // printf("mem is 0x%x\n", mem);
                if (mem == MAP_FAILED)  
                {  
                        printf ("mmap error\n");
                        munmap(mem, bsize);
                        mem = 0;
                        return -2;
                }

                // nrecv = recvBX(sock_connect, mem, bsize);
                if((nrecv = recvBX(sock_connect, mem, bsize)) < 0)
                {
                        printf("recvBX error\n");
                        munmap(mem, bsize);
                        mem = 0;
                        return -3;
                }

                crcVal=crc32(crcVal, mem, bsize);
                munmap(mem, bsize);
        }

        //map physical memory remainder bytes  
        mem = mmap (dst+loop*bsize, remainder, PROT_READ | PROT_WRITE, MAP_SHARED, fd_mem, 0);
        // printf("mem is 0x%x\n", mem);
        if (mem == MAP_FAILED)  
        {  
                printf ("mmap error\n");
                munmap(mem, remainder);
                mem = 0;
                return -4;
        }

        // nrecv = recvBX(sock_connect, mem, remainder);
        if((nrecv = recvBX(sock_connect, mem, remainder)) < 0)
        {
                printf("recvBX error\n");
                munmap(mem, bsize);
                mem = 0;
                return -5;
        }

        gettimeofday(&curr_time_2, NULL);
        time_val = (curr_time_2.tv_sec - curr_time_1.tv_sec) + (float)((curr_time_2.tv_usec - curr_time_1.tv_usec)*1.0/1000000);
        printf("time_val is %f\n", time_val);
        speed = xlen/time_val/1024/1024;
        printf("%d %d \n", curr_time_2.tv_sec, curr_time_1.tv_sec);
        printf("%d %d \n", curr_time_2.tv_usec, curr_time_1.tv_usec);
        printf("speed %f MB/s\n", speed);

        crcVal=crc32(crcVal, mem, remainder);
        printf("server crcVal is 0x%x\n", crcVal);
        munmap(mem, remainder);
        mem = 0;

        return 0;
}





回复

使用道具 举报

1293

TA的帖子

2

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

爱助人

发表于 2017-2-25 16:51:03 | 显示全部楼层
内核很早就对mmap /dev/mem做了限制。另外mmap以page为单位映射,第一个参数只是对内核的建议,也就是说内核可能会调整地址。所以,你这段代码,删了吧,没法搞。
人已离开,无事别找,找也找不到。


回复

使用道具 举报

938

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-2-25 22:22:09 | 显示全部楼层
,你mmap的物理地址是独立的吗,操作系统的运行会不会使用到你映射的地址

点评

独立的,我在引导参数中将linux的内存改为768M,希望映射的范围在768M之后  详情 回复 发表于 2017-3-8 09:52


回复

使用道具 举报

37

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2017-3-8 09:52:07 | 显示全部楼层
石玉 发表于 2017-2-25 22:22
,你mmap的物理地址是独立的吗,操作系统的运行会不会使用到你映射的地址

独立的,我在引导参数中将linux的内存改为768M,希望映射的范围在768M之后

点评

引导参数中应该是从栈顶预留的,方向搞反了没?  详情 回复 发表于 2017-3-8 09:55


回复

使用道具 举报

938

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-3-8 09:55:42 | 显示全部楼层
vlah 发表于 2017-3-8 09:52
独立的,我在引导参数中将linux的内存改为768M,希望映射的范围在768M之后

引导参数中应该是从栈顶预留的,方向搞反了没?


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-11-19 09:05 , Processed in 0.395991 second(s), 17 queries , Redis On.

快速回复 返回顶部 返回列表