2017-09-14 128 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`; 
相关问题