Linux 我们可以将大小设置为与malloc相同的大小吗?

Linux 我们可以将大小设置为与malloc相同的大小吗?,linux,memory-management,ubuntu,malloc,memset,Linux,Memory Management,Ubuntu,Malloc,Memset,ubuntu 10.04 LTS(2.6.32-38-generic)i686-intel i7-16GB 我得到一个映射失败错误,映射到memset一定的内存量。你知道吗?其他信息是我可以malloc相同大小。这是我的密码 //Here I could malloc successfully pdev->frame_buffer = (uint16_t *)malloc(3840000); //Then, I got map_failed error here a

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

我得到一个
映射失败
错误,映射到
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(01000,…)
,那么它将返回正确的地址。我不确定这个问题是否是因为尺寸


你能猜出为什么会发生这种情况吗?

你的成员集实际上有一个“关一关”的错误。您已经设置了3840000个字节,但您的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
,只包含
malloc
mmap

关于
mmap
失败的原因,我的猜测是,文件描述符引用了帧缓冲区(上下文建议是这样的,从变量名
frame\u buffer
和文件描述符
fb
),并且您有“分配的大于帧缓冲区”的组合,“分配了驱动程序不喜欢的权限/标志组合”和“其他一些模糊的原因”

映射帧缓冲区或任何其他设备内存并不像映射普通内存或文件那样简单(嗯,有点简单,但再次强调,不是),这可能有很多更明显和不太明显的原因导致失败

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