我试图mmap一个字符设备。它适用于65536字节。但如果我尝试更多内存,我会收到以下错误。mmap的内存限制
MMAP:资源暂时不可用
我想的mmap 1MB内存的设备。我为char设备使用了alloc_chrdev_region,cdev_init,cdev_add。如何映射大于65K的内存?我应该使用块设备吗?
我试图mmap一个字符设备。它适用于65536字节。但如果我尝试更多内存,我会收到以下错误。mmap的内存限制
MMAP:资源暂时不可用
我想的mmap 1MB内存的设备。我为char设备使用了alloc_chrdev_region,cdev_init,cdev_add。如何映射大于65K的内存?我应该使用块设备吗?
您是否实现* 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,
};
在mmap调用中使用MAP_LOCKED标志可能会导致此错误。如果无法锁定内存量,则使用的mlock可以返回EAGAIN。
从man mmap
:
MAP_LOCKED(因为Linux 37年2月5日)锁定映射区域 的页到存储器中m锁的方式(2)。在旧的 内核中该标志被忽略。
从man mlock
:
EAGAIN: 部分或全部指定的地址范围不能 锁定。
如果没有实现.mmap(),那么将返回ENODEV,而不是EAGAIN。 –
是的。正如我所说的,它适用于64K RAM。在函数中我调用remap_pfn_range。注册设备时看到没有问题。仅在从用户空间程序打开时。 – max
错误代码的来源是您的设备驱动程序'somedev_mmap'方法。你什么时候返回-EAGAIN? – Roland