Memory management 从linux内核访问用户空间数据

Memory management 从linux内核访问用户空间数据,memory-management,linux-kernel,Memory Management,Linux Kernel,这是一个要求部分实施流程检查点的分配问题: 测试程序分配一个数组,执行系统调用,并将数组的起始地址和结束地址传递给调用。在系统调用函数中,我必须将给定范围内的内容保存到文件中 根据我的理解,我可以简单地使用copy\u From\u usr功能保存给定范围内的内容。然而,由于作业是基于主题“进程地址空间”,我可能需要浏览页面表。假设我设法获得与给定范围相对应的结构页面。如何获取与页面对应的数据 我可以直接使用page to virt功能访问数据吗? 由于数组在虚拟空间中是连续的,我想我只需要将起

这是一个要求部分实施流程检查点的分配问题:

测试程序分配一个数组,执行系统调用,并将数组的起始地址和结束地址传递给调用。在系统调用函数中,我必须将给定范围内的内容保存到文件中

根据我的理解,我可以简单地使用copy\u From\u usr功能保存给定范围内的内容。然而,由于作业是基于主题“进程地址空间”,我可能需要浏览页面表。假设我设法获得与给定范围相对应的结构页面。如何获取与页面对应的数据

我可以直接使用page to virt功能访问数据吗? 由于数组在虚拟空间中是连续的,我想我只需要将起始地址转换为页面,然后再转换回虚拟地址,然后将数据的范围大小复制到文件。是吗?

我认为从用户()复制是可以的,不需要其他东西。在执行系统调用时,虽然它会占用内核空间,但上下文仍然是执行系统调用的进程上下文。内核仍然使用进程的页表。因此,只需使用copy_from_user(),无需其他操作


好的,如果你想做这个实验,我想你可以使用void\uu user*vaddr遍历mm->pgd(页面表),使用pgd\u offset/pud\u offset/pmd\u offset/pte\u offset获得页面物理地址(页面大小对齐)。然后在内核空间中,使用ioremap()创建内核空间映射,然后使用内核虚拟地址(页面大小)+偏移量(页面内部),获得数组的起始虚拟地址。现在在内核中,您可以使用虚拟地址访问阵列。

我认为从\u usr()复制\u是可以的。没有其他需要。如果我想使用另一种方法-遍历页面表并获取相关页面,该怎么办?作业要求我展示与内存管理相关的内核代码知识,因此我必须将其翻译成页面。