Linux kernel mmap的内存限制
我正在尝试mmap一个字符设备。它可以工作65536字节。但是如果我试图获得更多内存,就会出现以下错误 mmap:资源暂时不可用Linux kernel mmap的内存限制,linux-kernel,kernel,mmap,Linux Kernel,Kernel,Mmap,我正在尝试mmap一个字符设备。它可以工作65536字节。但是如果我试图获得更多内存,就会出现以下错误 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
我想为一个设备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 2.5.37以来)锁定映射区域的页面
以mlock(2)的方式进入内存。此标志在旧版本中被忽略
果仁
从手动锁
:
伊根:
无法找到指定的部分或全部地址范围
锁着的
如果未实现.mmap(),则将返回ENODEV,而不是EAGAIN.Yes。正如我所说,它是为64K内存工作。在函数中,我调用remap_pfn_range。我认为注册设备时没有问题。仅当从用户空间程序打开时。错误代码的来源是设备驱动程序
somedev\u mmap
方法。你什么时候回来-伊根?@Roland我也遇到了类似的错误。我的实现与您在伪代码中提到的相同。在remap\u pfn\u range
函数之后,我返回EAGAIN
。到底是什么原因导致此错误?