【发布时间】:2020-10-06 21:32:03
【问题描述】:
我正在开发一个旧的 linux 操作系统,它有一个用于所有进程的内核(它基本上是一种外内核类型)。 在从用户空间实现调试功能时,我想反汇编其他进程的命令。因此,我创建了一个系统调用,它获取目标进程的虚拟地址并在其中打印它的值(这样我就可以反汇编字节)。 我的想法是切换到目标的pgdir,调用pagewalk,然后访问物理地址指针中的数据。我在尝试访问后者时出现内核恐慌。 如果我切换到目标进程然后访问虚拟地址(没有 pagewalk),命令的字节打印没有任何问题(例如 printf("%04x", *va))。
我的问题是 - 为什么虚拟地址包含实际命令而物理地址不包含(为什么它会恐慌?)
谢谢!
【问题讨论】:
-
"然后访问物理地址指针中的数据。" - 无论您传递给 CPU 进行取消引用的任何地址,CPU 都会将此地址视为 virtual 之一。要读取物理地址的信息,您需要将该地址映射,并在指令中使用对应的虚拟地址。
-
@Tsyvarev 谢谢!我想我有我的问题。我应该切换页面目录(将其加载到适当的寄存器),然后访问虚拟地址,而不是进行 pagewalk。因为它是被映射的,所以它会打印它的内容。
标签: linux operating-system kernel