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,...)
,那么它会返回正确的地址。我不确定这个问题是不是因为它的大小。
你有没有猜到它为什么会发生?
答案 0 :(得分:0)
你的memset实际上有一个off-by-one错误。你已经malloc'd 3,840,000字节,但你的meset范围指定总共3,840,001字节设置。 args应该是
if((pdev->frame_buffer = (uint16_t *)mmap(0, 3839999, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0)) == MAP_FAILED){
^^^^^^^---note the change.
答案 1 :(得分:0)
您的代码示例根本不包含memset
,仅malloc
和mmap
?
我对为什么 mmap
失败的猜测是文件描述符引用了帧缓冲区(上下文建议这样做,来自变量名frame_buffer
和文件描述符fb
),你有“分配大于帧缓冲区”,“分配了驱动程序不喜欢的权限/标志组合”和“其他一些不明原因”的组合。
将帧缓冲区或任何其他设备内存映射不与映射普通内存或文件一样简单(好吧,它的种类是,但是又一次,不是),可以有更明显的并且不太明显的原因可能会导致失败。
首先要注意的是,如果您当前的屏幕分辨率乘以每像素字节数,则总计达到3840000。如果没有,你就会出界了。