02.07.2013 Views

Uboot中start.S源码的指令级的详尽解析

Uboot中start.S源码的指令级的详尽解析

Uboot中start.S源码的指令级的详尽解析

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!