【问题标题】:mmap() Resource temporarily unavailablemmap() 资源暂时不可用
【发布时间】:2018-02-24 00:53:08
【问题描述】:

我正在尝试实现内存管理内核模块。该模块使用mmap() 系统调用。实施后,我尝试调用 mmap 给我一个错误Resource temporarily unavailable 我经历了this 线程。该解决方案不适用于我的情况。

这是内核实现:- 不包括变量声明。

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;

remap 中的值为 0

【问题讨论】:

  • 能否提供完整的sn-p?你看 - 有一个错字(kAmlloc_ptr);此外,remap_pfn_range() 末尾缺少分号,并且没有 if 语句 - 我的意思是,return -EAGAIN 在任何情况下都已完成。此外,尽管pfn 参数的计算方式正确,但您根据kmalloc_ptr 计算它是如此奇怪。为什么你需要在这里分配一些内核内存?您应该在这里使用vma->vm_pgoff 而不是(virt_to_phys)(kamlloc_ptr) >> 12。因此,请同时显示其余代码。
  • @DaanGerlach 我刚刚发现问题出在没有 if 语句的 return EAGAIN 上。现在错误已解决。感谢您的帮助。
  • 不客气。另外,您最好使用PAGE_SHIFT 而不是幻数(12)。

标签: memory memory-management kernel-module mmap


【解决方案1】:

我发现了错误,我怀疑映射没有问题。

错误是重新映射应该用作

`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`;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 2018-08-04
    • 2021-05-07
    • 2016-01-25
    • 2012-04-25
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多