2017-09-14 138 views
2

我試圖實現內存管理內核模塊。該模塊使用mmap()系統調用。執行後,我試圖調用mmap,這給我一個錯誤Resource temporarily unavailable 我通過this線程。解決方案在我的情況下不起作用。mmap()資源暫時不可用

這是內核實現: - 排除變量聲明。在remap

kmalloc_ptr = kmalloc(size, GFP_KERNEL) 
static int simple_mmap(struct file *filp, struct vm_area_struct *vma) 
{ 
remap = remap_pfn_range(vma, vma->vm_start, (virt_to_phys)(kmalloc_ptr) >> 12, 
       vma->vm_end - vma->vm_start, 
       vma->vm_page_prot) 
     return -EAGAIN; 

值爲0

+0

能否請您提供完整的片段?你看 - 有一個錯字('kAmlloc_ptr');在'remap_pfn_range()'末尾缺少分號,並且沒有'if'語句 - 我的意思是,'return -EAGAIN'在任何情況下都完成。 此外,儘管「pfn」參數是以正確的方式計算的,但它是基於'kmalloc_ptr'計算的奇怪。爲什麼你需要在這裏分配一些內核內存?您應該在這裏使用'vma-> vm_pgoff',而不是'(virt_to_phys)(kamlloc_ptr)>> 12'。所以,還請顯示其餘的代碼。 –

+0

@DaanGerlach我剛纔發現問題出在沒有if語句的'return EAGAIN'上。現在錯誤已解決。感謝您的幫助。 – john

+0

不客氣。 此外,你最好使用'PAGE_SHIFT'而不是魔術數字('12')。 –

回答

0

我發現錯誤,我是不是錯了,因爲我曾懷疑的映射。

錯誤被重新映射應作爲

`if ((remap_pfn_range(vma, vma->vm_start, (unsigned long long)(virt_to_phys((void *)mapped_data)) >> PAGE_SHIFT, size, vma->vm_page_prot)) 
return -EAGAIN`; 
相關問題