通过内核读取物理地址中的值

问题描述 投票:0回答:1

我正在使用一个旧的Linux操作系统,该操作系统的所有进程都有一个内核(基本上是exo-kernel类型)。从用户空间实现调试功能时,我想反汇编其他进程的命令。因此,我创建了一个系统调用,该调用在目标进程中获取虚拟地址并在其中打印其值(以便我可以反汇编字节)。我的想法是切换到目标的pgdir,调用pagewalk,然后访问物理地址指针中的数据。我在尝试访问后面版本时遇到内核恐慌。如果我切换到目标进程,然后访问虚拟地址(不使用pagewalk),则命令的字节将毫无问题地打印出来(例如,使用printf(“%04x”,* va))。

我的问题是-为什么虚拟地址不包含实际命令,而物理地址不包含(为什么会出现紧急情况?]

谢谢!

linux operating-system kernel
1个回答
0
投票

注意:这是一个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一些参考?

© www.soinside.com 2019 - 2024. All rights reserved.