【问题标题】:Can we memset same size with the size we can malloc?我们可以 memset 与我们可以 malloc 的大小相同的大小吗?
【发布时间】:2012-03-05 02:32:10
【问题描述】:

ubuntu 10.04 LTS(2.6.32-38-generic) i686 - 英特尔 i7 - 16GB

memset 一定数量的内存出现map failed 错误。你有什么主意吗?附加信息是我可以malloc 相同大小。这是我的代码。

    //Here I could malloc successfully
    pdev->frame_buffer = (uint16_t *)malloc(3840000);
    //Then, I got map_failed error here and message from compiler is "Invalid argument"
    if((pdev->frame_buffer = (uint16_t *)mmap(0, 3840000, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0)) == MAP_FAILED){
        perror("Error: cannot mmap frame buffer");
        exit(1);
    }

如果我mmap 小于我上面尝试的大小,如mmap(0, 100,...),那么它会返回正确的地址。我不确定这个问题是不是因为尺寸。

你猜到为什么会这样吗?

【问题讨论】:

    标签: linux memory-management ubuntu malloc memset


    【解决方案1】:

    您的代码示例根本不包含memset,只有mallocmmap

    我对 为什么 mmap 失败的猜测是文件描述符引用了帧缓冲区(上下文表明,变量名 frame_buffer 和文件描述符 fb 都是如此) ,并且您有“分配大于帧缓冲区”、“使用驱动程序不喜欢的权限/标志组合分配”和“其他一些晦涩的原因”的组合。

    映射帧缓冲区或任何其他设备内存并不像映射普通内存或文件那样微不足道(嗯,它有点像,但又不是),可能有很多更明显以及可能失败的不太明显的原因。

    首先要寻找的是,您当前的屏幕分辨率乘以每像素字节数的总和是否为 3840000。如果没有,那你就出界了。

    【讨论】:

      【解决方案2】:

      你的 memset 实际上有一个错误。您已经 malloc 了 3,840,000 个字节,但您的 meset 范围指定总共要设置 3,840,001 个字节。参数应该是

      if((pdev->frame_buffer = (uint16_t *)mmap(0, 3839999, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0)) == MAP_FAILED){
                                                   ^^^^^^^---note the change.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-14
        • 1970-01-01
        • 2012-05-18
        • 2019-01-05
        • 2011-04-08
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多