我们可以将内存集的大小和malloc的大小相同吗



ubuntu 10.04 LTS(2.6.32-38-generic)i686-intel i7-16GB

我得到了一个map failed错误到memset一定量的内存。你知道吗?附加信息是我可以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,...)小,那么它会返回正确的地址。我不确定这个问题是不是因为尺寸的问题。

你猜到为什么会发生这种事吗?

您的memset实际上有一个off-by-one错误。您已经对3840000个字节进行了malloc,但您的meset范围指定了要设置的总共3840001个字节。args应该是

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

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

关于为什么mmap失败,我的猜测是文件描述符引用了帧缓冲区(上下文从变量名frame_buffer和文件描述符fb中都表明了这一点),并且您有一个"分配的大于帧缓冲区"、"分配了驱动程序不喜欢的权限/标志组合"one_answers"其他一些模糊的原因"的组合。

映射帧缓冲区或任何其他设备内存是而不是像映射正常内存或文件那样微不足道(嗯,这有点像,但话说回来,不是),这可能会失败,原因可能更明显,也可能不太明显。

第一件显而易见的事情是,如果你当前的屏幕分辨率乘以每像素的字节数加起来达到3840000。如果没有,你就出界了。

相关内容

  • 没有找到相关文章

最新更新