【发布时间】:2012-01-06 06:22:28
【问题描述】:
我正在尝试映射一个字符设备。它适用于 65536 字节。但是如果我尝试更多内存,我会收到以下错误。
mmap:资源暂时不可用
我想为设备映射 1MB 内存。我使用 alloc_chrdev_region、cdev_init、cdev_add 作为 char 设备。如何 mmap 大于 65K 的内存?我应该使用块设备吗?
【问题讨论】:
标签: linux-kernel kernel mmap
我正在尝试映射一个字符设备。它适用于 65536 字节。但是如果我尝试更多内存,我会收到以下错误。
mmap:资源暂时不可用
我想为设备映射 1MB 内存。我使用 alloc_chrdev_region、cdev_init、cdev_add 作为 char 设备。如何 mmap 大于 65K 的内存?我应该使用块设备吗?
【问题讨论】:
标签: linux-kernel kernel mmap
你实现了*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,
};
【讨论】:
somedev_mmap方法。你什么时候返回-EAGAIN?
remap_pfn_range 函数之后返回EAGAIN。究竟是什么导致了这个错误?
在 mmap 调用中使用 MAP_LOCKED 标志可能会导致此错误。如果无法锁定内存量,使用的 mlock 可以返回 EAGAIN。
来自man mmap:
MAP_LOCKED(自 Linux 2.5.37 起)锁定映射区域的页面 以 mlock(2) 的方式进入内存。此标志在旧版本中被忽略 内核。
来自man mlock:
再次: 部分或全部指定的地址范围不能 锁定。
【讨论】: