内核如何通过虚拟地址

时间:2017-06-05 16:23:00

标签: c memory-management linux-kernel linux-device-driver

这些天我正在写一个设备驱动程序。用户进程通过mmap获取虚拟地址,并使用remap_pfn_range与物理地址进行映射。现在我需要在内核的vm_operations_struct中实现.access函数来获取用户线程传递的虚拟地址的映射内存,这是我遇到的问题。
int vm_access(struct vm_area_struct *vma, unsigned long addr, void *buf, int len, int write) 我需要将addr中的数据复制到* buf,该数据是mmap分配的虚拟地址,并映射到物理地址。我试过copy_from_user,它失败了;当我尝试memcpy_fromio时,操作系统只是在被调用时崩溃。尝试了几种方法,但是没有工作。

有没有办法这么做,或者它不实用?提前谢谢!

更新:
现在的问题是在内核设备驱动程序中已经将物理内存映射到用户空间。我使用ioremap和memcpy_fromio来获取数据,但是系统崩溃了..但是由于地址可以在用户模式进程中使用mmap和remap_pfn_range成功到达,所以我在内核中无法读取它会让人感到困惑。

0 个答案:

没有答案