【问题标题】:Accessing user space data from linux kernel从 linux 内核访问用户空间数据
【发布时间】:2013-03-15 00:55:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我认为 copy_from_usr() 没问题。不需要其他任何东西。

标签: memory-management linux-kernel


【解决方案1】:

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

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

【讨论】:

  • 如果我想使用其他方法 - 遍历页表并获取相关页面怎么办?作业要求我展示与内存管理相关的内核代码知识,因此我必须翻译到页面。
猜你喜欢
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 2018-06-30
  • 2018-05-22
  • 2018-01-01
  • 2012-12-26
相关资源
最近更新 更多