本文共 1687 字,大约阅读时间需要 5 分钟。
在linux启动后,能正常交互时,按下reset按键,进入reset异常后
具体芯片手册中有 reset 相关的 记录 每个 ip 都有 reset 的概念, 而 reset 管脚 管理了哪些 ip的reset 需要关注 1. Hardware reset : XnRESET 拉低 4个 CLK // 这个 Hardware reset 会 拉低 ip cpu的 reset ,同时还会拉低 cp15的reset // mmu相关的寄存器已经复位,此时mmu关闭,此时 只有物理地址 // 此时不能访问ddr,因为ddr控制器相关的寄存器也已经复位 // 且 此时的0x00000000 不是指向 ddr ,因为 arm系统的 memory map 把 0x0000 0000留给了 bootrom // 拉高 ip cpu的 reset // 然后才 进入 reset 异常 , 异常中设置的pc为0x00000000 // 所以开始从 bootrom 启动 2. Watchdog reset : // 由 ip watchdog 拉低 cpu 的reset , 然后拉高 // 会不会拉低 cp15 的 reset 3. Wakeup reset : return from SLEEP mode // 由 ip Wakeup 拉低 cpu 的reset , 然后拉高 // 会不会 拉低 cp15 的 reset // 一般不会出现 cpu reset 且 cp15 没有reset 的情况,所以一般来说 vector_rst 不会被运行.
arch/arm/kernel/entry-armv.S 1183 .L__vectors_start: 1184 W(b) vector_rst ... 1046 vector_rst: 1047 ARM( swi SYS_ERROR0 ) // 在 特权 模式下进入 swi 异常 1048 THUMB( svc #0 ) 1049 THUMB( nop ) 1050 b vector_und
arch/arm/kernel/entry-armv.S1183 .L__vectors_start:...1186 W(ldr) pc, .L__vectors_start + 0x1000arch/arm/kernel/entry-common.S169 ENTRY(vector_swi)...260 invoke_syscall tbl, scno, r10, __ret_fast_syscall...265 bcs arm_syscallarch/arm/kernel/traps.carm_syscall switch (no & 0xffff) { case 0: arm_notify_die("branch through zero", regs, SIGSEGV, SEGV_MAPERR, NULL, 0, 0); if (user_mode(regs)) { }else die(str, regs, err); __die(str, err, regs) notify_die __show_regs oops_end(flags, regs, sig)
转载地址:http://mjigi.baihongyu.com/