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
,只包含malloc
和mmap
?
关于为什么mmap
失败,我的猜测是文件描述符引用了帧缓冲区(上下文从变量名frame_buffer
和文件描述符fb
中都表明了这一点),并且您有一个"分配的大于帧缓冲区"、"分配了驱动程序不喜欢的权限/标志组合"one_answers"其他一些模糊的原因"的组合。
映射帧缓冲区或任何其他设备内存是而不是像映射正常内存或文件那样微不足道(嗯,这有点像,但话说回来,不是),这可能会失败,原因可能更明显,也可能不太明显。
第一件显而易见的事情是,如果你当前的屏幕分辨率乘以每像素的字节数加起来达到3840000。如果没有,你就出界了。