2011-11-25 94 views
1

我試圖mmap一個字符設備。它適用於65536字節。但如果我嘗試更多內存,我會收到以下錯誤。mmap的內存限制

MMAP:資源暫時不可用

我想的mmap 1MB內存的設備。我爲char設備使用了alloc_chrdev_region,cdev_init,cdev_add。如何映射大於65K的內存?我應該使用塊設備嗎?

回答

0

您是否實現* 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, 
}; 
+0

如果沒有實現.mmap(),那麼將返回ENODEV,而不是EAGAIN。 –

+0

是的。正如我所說的,它適用於64K RAM。在函數中我調用remap_pfn_range。註冊設備時看到沒有問題。僅在從用戶空間程序打開時。 – max

+0

錯誤代碼的來源是您的設備驅動程序'somedev_mmap'方法。你什麼時候返回-EAGAIN? – Roland

1

在mmap調用中使用MAP_LOCKED標誌可能會導致此錯誤。如果無法鎖定內存量,則使用的mlock可以返回EAGAIN。

man mmap

MAP_LOCKED(因爲Linux 37年2月5日)鎖定映射區域 的頁到存儲器中m鎖的方式(2)。在舊的 內核中該標誌被忽略。

man mlock

EAGAIN: 部分或全部指定的地址範圍不能 鎖定。