Linux kernel 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一个字符设备。它可以工作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 *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
。到底是什么原因导致此错误?