1

ubuntu 10.04 LTS(2.6.32-38-generic)i686 - 英特尔 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,...),那么它会返回正确的地址。我不确定这个问题是否是因为尺寸。

你有任何猜测为什么会发生吗?

4

2 回答 2

0

您的 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.
于 2012-02-13T17:33:14.980 回答
0

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

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

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

要寻找的第一个明显的事情是您当前的屏幕分辨率乘以每像素字节数加起来是否为 3840000。如果没有,那你就出界了。

于 2012-02-14T10:40:11.760 回答