2011-11-25 49 views
1

我试图mmap一个字符设备。它适用于65536字节。但如果我尝试更多内存,我会收到以下错误。mmap的内存限制

MMAP:资源暂时不可用

我想的mmap 1MB内存的设备。我为char设备使用了alloc_chrdev_region,cdev_init,cdev_add。如何映射大于65K的内存?我应该使用块设备吗?

回答

0

您是否实现* somedevice_mmap()*文件操作?

static int somedev_mmap(struct file *filp, struct vm_area_struct *vma) 
{ 
    /* Do something. You probably need to use ioremap(). */ 

    return 0; 
} 

static const struct file_operations somedev_fops = { 
    .owner = THIS_MODULE, 
    /* Initialize other file operations. */ 
    .mmap = somedev_mmap, 
}; 
+0

如果没有实现.mmap(),那么将返回ENODEV,而不是EAGAIN。 –

+0

是的。正如我所说的,它适用于64K RAM。在函数中我调用remap_pfn_range。注册设备时看到没有问题。仅在从用户空间程序打开时。 – max

+0

错误代码的来源是您的设备驱动程序'somedev_mmap'方法。你什么时候返回-EAGAIN? – Roland

1

在mmap调用中使用MAP_LOCKED标志可能会导致此错误。如果无法锁定内存量,则使用的mlock可以返回EAGAIN。

man mmap

MAP_LOCKED(因为Linux 37年2月5日)锁定映射区域 的页到存储器中m锁的方式(2)。在旧的 内核中该标志被忽略。

man mlock

EAGAIN: 部分或全部指定的地址范围不能 锁定。