MMAP尝试双缓冲帧构建失败

时间:2016-10-11 02:33:10

标签: linux mmap

我正在尝试使用ioctl实现双缓冲区(fd,FBIOPAN_DISPLAY ... 我的单个缓冲区代码工作正常

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;

fbp = (char*)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);

当我尝试使用屏幕大小* 2增加“长度参数”时,mmap会失败并显示EINVAL。我认为它不喜欢我的长度参数。

单个缓冲区的屏幕大小为6,220,800,双缓冲区的屏幕大小为12,441600。这是一个嵌入式系统,但它有1千兆的RAM。

长度参数是size_t,在这个系统上只有4个字节,这会让我觉得我可以使用的最大尺寸是4 Meg,但是6 Meg的工作正常,所以我觉得我错过了一些非常简单的东西。有没有办法让mmap缓冲区大于size_t?

1 个答案:

答案 0 :(得分:1)

The man page表示长度(第二个参数)的类型为size_t,因此我认为传递更大的类型并不安全。

我建议您只绘制第一部分,然后重新映射第二部分,如in this SO Q&A所示。

关于EINVAL: 以下内容见手册页:

  

EINVAL       我们不喜欢addr,length或offset(例如,它们太大,或者没有在页面边界上对齐)。

     

EINVAL       (自Linux 2.6.12起)长度为0.

     

EINVAL       flags既不包含MAP_PRIVATE也不包含MAP_SHARED,或包含这两个值。

你确定你是页面对齐吗?