【问题标题】:Memory limit for mmapmmap 的内存限制
【发布时间】:2012-01-06 06:22:28
【问题描述】:

我正在尝试映射一个字符设备。它适用于 65536 字节。但是如果我尝试更多内存,我会收到以下错误。

mmap:资源暂时不可用

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

【问题讨论】:

    标签: linux-kernel kernel mmap


    【解决方案1】:

    你实现了*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() 没有实现,则返回 ENODEV,而不是 EAGAIN。
    • 是的。正如我所说,它适用于 64K RAM。在我调用 remap_pfn_range 的函数中。注册设备时我没有看到任何问题。仅当从用户空间程序打开时。
    • 错误代码的来源是您的设备驱动程序somedev_mmap方法。你什么时候返回-EAGAIN?
    • @Roland 我遇到了类似的错误。我的实现与您在伪代码中提到的相同。我在remap_pfn_range 函数之后返回EAGAIN。究竟是什么导致了这个错误?
    【解决方案2】:

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

    来自man mmap

    MAP_LOCKED(自 Linux 2.5.37 起)锁定映射区域的页面 以 mlock(2) 的方式进入内存。此标志在旧版本中被忽略 内核。

    来自man mlock

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

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 2012-01-08
      • 2016-06-03
      • 1970-01-01
      相关资源
      最近更新 更多