我試圖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