arm64 - 硬件 [break/watch] 点:如果我们设置硬件 [break/watch] 点并且两个应用程序具有相同的虚拟地址会怎样?
arm64 - Hardware [break/watch]point: what happens if we set a hardware [break/watch]point and two applications have the same virtual address?
让我们以 free-bsd
, arm64
(aarch64) 的调试监视器为例。我选择 free-bsd
因为代码是可读的,但是这个问题对于任何其他内核都是有效的,例如 Linux.
参考调试监视器 freebsd arm64:here
在arm64中,硬件[break/watch]点是通过两个重要的寄存器获得的,一个是驱动“地址”寄存器的“控制”寄存器。您可以在此处找到一个不错的架构 here(“断点异常”和“观察点异常”部分,而非“断点指令异常”部分)。
让我们以断点作为参考。根据 arm64 手册:
Breakpoint matches when the PE executes from a virtual address with the same value as the DBGBVR register, and the current state of the PE matches the settings in DBGBCR.
其中PE
代表Processing element
,DBGBVR
是上述“地址”寄存器,DBGBCR
是上述“控制”寄存器。
官方文档明确说了虚拟地址。如果多个应用程序使用相同的虚拟地址共享地址(在 TEXT 段中用于断点,在 DATA 段中用于观察点),会发生什么情况?进程 A
的断点(观察点)是否会被进程 B
到达的同一虚拟地址错误触发?
Can the breakpoint (watchpoint), supposed for process A, being triggered erroneously by the same virtual address reached by process B?
是的。
无论何时关闭 TTBRx_EL1,您也应该关闭 break-/watchpoint 寄存器。
让我们以 free-bsd
, arm64
(aarch64) 的调试监视器为例。我选择 free-bsd
因为代码是可读的,但是这个问题对于任何其他内核都是有效的,例如 Linux.
参考调试监视器 freebsd arm64:here
在arm64中,硬件[break/watch]点是通过两个重要的寄存器获得的,一个是驱动“地址”寄存器的“控制”寄存器。您可以在此处找到一个不错的架构 here(“断点异常”和“观察点异常”部分,而非“断点指令异常”部分)。
让我们以断点作为参考。根据 arm64 手册:
Breakpoint matches when the PE executes from a virtual address with the same value as the DBGBVR register, and the current state of the PE matches the settings in DBGBCR.
其中PE
代表Processing element
,DBGBVR
是上述“地址”寄存器,DBGBCR
是上述“控制”寄存器。
官方文档明确说了虚拟地址。如果多个应用程序使用相同的虚拟地址共享地址(在 TEXT 段中用于断点,在 DATA 段中用于观察点),会发生什么情况?进程 A
的断点(观察点)是否会被进程 B
到达的同一虚拟地址错误触发?
Can the breakpoint (watchpoint), supposed for process A, being triggered erroneously by the same virtual address reached by process B?
是的。
无论何时关闭 TTBRx_EL1,您也应该关闭 break-/watchpoint 寄存器。