【发布时间】:2011-05-11 12:58:41
【问题描述】:
我有一个问题是与 Linux 2.6.35 上 ARM v7 上的 BKPT 指令相关联。主要原因是故障指令(bkpt)的地址不正确,与ARM v7手册不对应。
复制步骤如下:
-
将 OS SIGBUS 处理程序重新定义为我的 SIGBUS 处理程序:
void InitSigBusHandler() { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_flags = SA_SIGINFO; sigfillset(&sa.sa_mask); sa.sa_sigaction = SigBusHandler; sigaction(SIGBUS, &sa, NULL); } -
使用内联_asm,将“BKPT”指令放入main()函数的代码中:
int main(int argc, char **argv) { InitSigBusHandler(); __asm ( "bkpt\n\t" ); return 0; } -
这是我的 SIGBUS 处理程序:
void SigBusHandler( int signum, siginfo_t *pAct, void *pOldAct ) { write(2, (const char *)MSG_SIGBUS_IN_HANDLER, strlen((const char *)MSG_SIGBUS_IN_HANDLER) ); uint32_t faultAddr = (uint32_t)pAct->si_addr; memcpy((void *)buffer, (void *)MSG_SIGBUS_FAULT_ADDR, strlen(MSG_SIGBUS_FAULT_ADDR) ); write(2, (const char *)MSG_SIGBUS_FAULT_ADDR, strlen((const char *)MSG_SIGBUS_FAULT_ADDR) ); sprintf(buffer, "%x\n", faultAddr); write(2, buffer, strlen(buffer)); } -
问题是指令(bkpt)的故障地址错误,不符合ARM v7规范。这是程序运行后的控制台输出:
在 SIGBUS 处理程序中:
故障地址:86b0
在 SIGBUS 处理程序中:
故障地址:86c0
在 SIGBUS 处理程序中:
故障地址:86c0
在 SIGBUS 处理程序中:
故障地址:86c0
在 SIGBUS 处理程序中:
故障地址:86c0
在 SIGBUS 处理程序中:
故障地址:86b0
在 SIGBUS 处理程序中:
故障地址:86a8
在 SIGBUS 处理程序中:
故障地址:86f0
在 x86 架构上,此示例可以正常工作。在 ARM v7 架构上,此示例有一个奇怪的行为。
如果我在 ARM v7 上使用 GDB,他会用正确的地址捕获我的 BKPT 指令。
也许有人知道我做错了什么?
【问题讨论】: