You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
如果发生未定义指令异常,CPU会<br />
掉转到start.S开头中对应的位置:<br />
ldr pc, _undefined_instruction<br />
即把地址为_undefined_instruction中的内容给pc,即跳转到此处执行对应的代码。<br />
其做的事情依次是:<br />
获得出错时候的堆栈<br />
保存用户模式寄存器<br />
跳转到对应的函数:do_undefined_instruction<br />
而do_undefined_instruction函数是在:<br />
u-boot-1.1.6_20100601\opt\EmbedSky\u-boot-1.1.6\cpu\arm920t\interrupts.c<br />
中:<br />
┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳<br />
void bad_mode (void)<br />
{<br />
}<br />
panic ("Resetting CPU ...\n");<br />
reset_cpu (0);<br />
void do_undefined_instruction (struct pt_regs *pt_regs)<br />
{<br />
}<br />
printf ("undefined instruction\n");<br />
show_regs (pt_regs);<br />
bad_mode ();<br />
┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻┻<br />
可以看到,此处起始啥事没错,只是打印一下出错时候的寄存器的值,然后跳转到bad_mode中<br />
取reset CPU,直接重启系统了。<br />
software_interrupt:<br />
get_bad_stack<br />
bad_save_user_regs<br />
bl do_software_interrupt<br />
.align 5<br />
prefetch_abort:<br />
get_bad_stack<br />
bad_save_user_regs<br />
bl do_prefetch_abort<br />
.align 5<br />
data_abort:<br />
get_bad_stack