我的启动代码为0x08000000,应用程序代码为0x08060000。如果我注释掉下面显示的条件检查,则可以从启动代码跳转到应用程序:
//if (( (*(__IO uint32_t*)0x08060000) & 0x2FFE0000 ) == 0x20000000)
{
JumpAddress = *(__IO uint32_t*)( 0x08060000 + 4 );
Jump_To_Application = (pFunction)JumpAddress;
__set_MSP( *(__IO uint32_t*)0x08060000 );
Jump_To_Application();
}
不满足条件,因为左侧等于0x20020000。我不明白为什么它是0x20020000而不是0x20000000。
为什么我们用0x20000000检查起始地址的内容。该内存地址中存储了什么,通常应该是什么?
答案 0 :(得分:1)
这是一个向量表,位于这些地址处(对于引导程序,在0x08000000
处,对于应用程序,在0x08060000
处)。向量表中存储的第一个值是堆栈指针的重置值。
您可以查看此链接以获取更多信息:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/BABIFJFG.html
为什么您要以这种方式检查此值,可能只有一个猜测。可能会充当一种安全检查,以查看是否可能已加载有效的应用程序。这绝对是不够的,不能保证太多(例如,可能会加载一半的应用程序)。它还完全取决于您的内存布局以及您决定将堆栈放置在RAM中的哪个位置。我假设您复制粘贴(或生成)了负责您的应用程序中的内存布局的代码的某些部分,然后从另一个来源复制粘贴了有待检查的代码的这一部分。这两个可能无法很好地配合。