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 elementDBGBVR是上述“地址”寄存器,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 寄存器。