我正在尝试使用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?
答案 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,或包含这两个值。
你确定你是页面对齐吗?