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

时间:2013-03-15 00:55:58

标签: memory-management linux-kernel

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

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

根据我的理解,我可以简单地使用 copy_from_usr 功能来保存给定范围内的内容。但是,由于赋值基于主题“进程地址空间”,我可能需要遍历页表。假设我设法获得与给定范围对应的 struct pages 。如何获取与页面对应的数据?

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

1 个答案:

答案 0 :(得分:2)

我认为copy_from_user()没关系,没有别的需要。在执行系统调用时,尽管它陷入内核空间,但上下文仍然是执行系统调用的进程上下文。内核仍然使用进程的页表。所以只需要使用copy_from_user(),而不需要任何其他东西。

哦,如果你想做这个实验,我想你可以使用void __user * vaddr来遍历mm-> pgd(页面表),使用pgd_offset / pud_offset / pmd_offset / pte_offset来获取页面物理地址(页面大小对齐)。然后在内核空间中,使用ioremap()创建内核空间映射,然后使用内核虚拟地址(页面大小)+偏移量(页面内部),获取数组的起始虚拟地址。现在在内核中,您可以使用虚拟地址来访问数组。