mmap()资源暂时不可用
问题描述:
我试图实现内存管理内核模块。该模块使用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
答
我发现错误,我是不是错了,因为我曾怀疑的映射。
错误被重新映射应作为
`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`;
能否请您提供完整的片段?你看 - 有一个错字('kAmlloc_ptr');在'remap_pfn_range()'末尾缺少分号,并且没有'if'语句 - 我的意思是,'return -EAGAIN'在任何情况下都完成。 此外,尽管“pfn”参数是以正确的方式计算的,但它是基于'kmalloc_ptr'计算的奇怪。为什么你需要在这里分配一些内核内存?您应该在这里使用'vma-> vm_pgoff',而不是'(virt_to_phys)(kamlloc_ptr)>> 12'。所以,还请显示其余的代码。 –
@DaanGerlach我刚才发现问题出在没有if语句的'return EAGAIN'上。现在错误已解决。感谢您的帮助。 – john
不客气。 此外,你最好使用'PAGE_SHIFT'而不是魔术数字('12')。 –