【发布时间】: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