【问题标题】:Reading a value in a physical address via the kernel通过内核读取物理地址中的值
【发布时间】:2020-10-06 21:32:03
【问题描述】:

我正在开发一个旧的 linux 操作系统,它有一个用于所有进程的内核(它基本上是一种外内核类型)。 在从用户空间实现调试功能时,我想反汇编其他进程的命令。因此,我创建了一个系统调用,它获取目标进程的虚拟地址并在其中打印它的值(这样我就可以反汇编字节)。 我的想法是切换到目标的pgdir,调用pagewalk,然后访问物理地址指针中的数据。我在尝试访问后者时出现内核恐慌。 如果我切换到目标进程然后访问虚拟地址(没有 pagewalk),命令的字节打印没有任何问题(例如 printf("%04x", *va))。

我的问题是 - 为什么虚拟地址包含实际命令而物理地址不包含(为什么它会恐慌?)

谢谢!

【问题讨论】:

  • "然后访问物理地址指针中的数据。" - 无论您传递给 CPU 进行取消引用的任何地址,CPU 都会将此地址视为 virtual 之一。要读取物理地址的信息,您需要将该地址映射,并在指令中使用对应的虚拟地址。
  • @Tsyvarev 谢谢!我想我有我的问题。我应该切换页面目录(将其加载到适当的寄存器),然后访问虚拟地址,而不是进行 pagewalk。因为它是被映射的,所以它会打印它的内容。

标签: linux operating-system kernel


【解决方案1】:

注意:这是一个 XY 答案...我知道我没有回答 您的问题(“如何使用硬件 MMU 设置来读取...某处的内存”)但我建议您提出的问题(如何从另一个进程的地址空间读取)的解决方案。

Linux 提供了一种工具来满足您的要求 - 从另一个进程的地址空间读取内存 - 通过使用 ptrace()

   PTRACE_PEEKTEXT, PTRACE_PEEKDATA
          Read a word at the address addr in the tracee's memory, returning
          the word as the result of the ptrace() call.  Linux does not have
          separate text and data address spaces, so these two requests are 
          currently equivalent.  (data is ignored; but see NOTES.)

https://stackoverflow.com/search?q=ptrace+PTRACE_PEEKDATA 一些参考资料?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2016-03-12
    • 1970-01-01
    • 2011-09-09
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多