Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 内核如何通过虚拟地址到达mmaped内存_C_Memory Management_Linux Kernel_Linux Device Driver - Fatal编程技术网

C 内核如何通过虚拟地址到达mmaped内存

C 内核如何通过虚拟地址到达mmaped内存,c,memory-management,linux-kernel,linux-device-driver,C,Memory Management,Linux Kernel,Linux Device Driver,这些天我在写一个设备驱动程序。用户进程通过mmap获得一个虚拟地址,并映射到一个物理地址,地址范围为remap_pfn_。现在我需要在内核中的vm_operations_struct中实现.access函数,以获取用户线程传递的虚拟地址的映射内存,我遇到了这个问题。 int-vm\u访问(结构vm\u区域结构*vma,无符号长地址,void*buf,int-len,int-write) 我需要将addr中的数据复制到*buf,addr是mmap分配的虚拟地址,映射到物理地址。我试图从用户处复制

这些天我在写一个设备驱动程序。用户进程通过mmap获得一个虚拟地址,并映射到一个物理地址,地址范围为remap_pfn_。现在我需要在内核中的vm_operations_struct中实现.access函数,以获取用户线程传递的虚拟地址的映射内存,我遇到了这个问题。
int-vm\u访问(结构vm\u区域结构*vma,无符号长地址,void*buf,int-len,int-write)
我需要将addr中的数据复制到*buf,addr是mmap分配的虚拟地址,映射到物理地址。我试图从用户处复制,但失败了;当我尝试memcpy_fromio时,操作系统在被调用时就会崩溃。。尝试了几种方法,但都不起作用

有没有办法做到这一点,或者说根本不可行?提前谢谢

更新:

现在的问题是如何在内核设备驱动程序中将物理内存映射到用户空间。我使用ioremap和memcpy_fromio来获取数据,但是系统崩溃了。。但由于使用mmap和remap_pfn_range在用户模式过程中可以成功访问该地址,因此我无法在内核中读取该地址,这让人感到困惑。

谢谢@stark。我尝试了
set\u fs(KERNEL\u DS)
,但似乎也不起作用。我发现问题在于用户空间隔离。我想为gdb调试使用实现这个函数,但是由于gdb是一个不同的用户进程,它不能直接到达exec用户空间。我需要的是找到一种从内核获取实际物理地址的方法。。。