start.s详解 2

上传人:简****9 文档编号:107903509 上传时间:2019-10-21 格式:DOC 页数:8 大小:37.50KB
返回 下载 相关 举报
start.s详解 2_第1页
第1页 / 共8页
start.s详解 2_第2页
第2页 / 共8页
start.s详解 2_第3页
第3页 / 共8页
start.s详解 2_第4页
第4页 / 共8页
start.s详解 2_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《start.s详解 2》由会员分享,可在线阅读,更多相关《start.s详解 2(8页珍藏版)》请在金锄头文库上搜索。

1、/* CPU_init_critical registers* setup important registers* setup memory timing*/CPU初始化#ifndef CONFIG_SKIP_LOWLEVEL_INITcpu_init_crit:/* flush v4 I/D caches*/初始化CACHESmovr0, #0mcrp15, 0, r0, c7, c7, 0/* flush v3/v4 cache */mcrp15, 0, r0, c8, c7, 0/* flush v4 TLB */* disable MMU stuff and caches*/关闭MM

2、U和CACHESmrcp15, 0, r0, c1, c0, 0bicr0, r0, #0x00002300 clear bits 13, 9:8 (-V- -RS)bicr0, r0, #0x00000087 clear bits 7, 2:0 (B- -CAM)orrr0, r0, #0x00000002 set bit 2 (A) Alignorrr0, r0, #0x00001000 set bit 12 (I) I-Cachemcrp15, 0, r0, c1, c0, 0对协处理器的操作还是看不懂,暂时先不管吧,有时间研究一下ARM技术手册的协处理器部分。/* before rel

3、ocating, we have to setup RAM timing* because memory timing is board-dependend, you will* find a lowlevel_init.S in your board directory.*/初始化RAM时钟,因为内存是跟开发板密切相关的,所以这部分在/开发板目录/lowlevel_init.S中实现 movip, lr保存LR,以便正常返回,注意前面是通过BL跳到cpu_init_crit来的。(ARM9有37个寄存器,ARM7有27个)37个寄存器=7个未分组寄存器(R0R7)+ 2(5个分组寄存器R8R

4、12)+62(R13=SP,R14=lr 分组寄存器) + 1(R15=PC) +1(CPSR) + 5(SPSR)用途和访问权限:R0R7:USR(用户模式)、fiq(快速中断模式)、irq(中断模式)、svc(超级用法模式)、abt、undR8R12:R8_usrR12_usr(usr,irq,svc,abt,und)R8_fiqR12_fiq(fiq) R11=fpR12=IP(从反汇编上看,fp和ip一般用于存放SP的值)R13R14:R13_usr R14_usr(每种模式都有自己的寄存器)SP lr :R13_fiq R14_fiqR13_irq R14_irqR13_svc R1

5、4_svcR13_abt R14_abtR13_und R14_undR15(PC):都可以访问(即PC的值为当前指令的地址值加8个字节)R16 :((Current Program Status Register,当前程序状态寄存器))SPSR _fiq,SPSR_irq,SPSR_abt,SPSR_und(USR模式没有)#ifdefined(CONFIG_AT91RM9200EK)#elsebllowlevel_init跳到底层硬件初始化,这部分代码在自己建立的开发板目录下的lowlevel_init.S中。#endifmovlr, ipmovpc, lr返回到主程序#endif /*

6、CONFIG_SKIP_LOWLEVEL_INIT */* Interrupt handling*/这段没有看明白,不过好像跟移植关系不是很大,先放一放。 IRQ stack frame.#define S_FRAME_SIZE72#define S_OLD_R068#define S_PSR64#define S_PC60#define S_LR56#define S_SP52#define S_IP48#define S_FP44#define S_R1040#define S_R936#define S_R832#define S_R728#define S_R624#define S_

7、R520#define S_R416#define S_R312#define S_R28#define S_R14#define S_R00#define MODE_SVC 0x13#define I_BIT 0x80/* use bad_save_user_regs for abort/prefetch/undef/swi .* use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling*/.macrobad_save_user_regssubsp, sp, #S_FRAME_SIZEstmiasp, r0 - r

8、12 Calling r0-r12ldrr2, _armboot_startsubr2, r2, #(CONFIG_STACKSIZE)subr2, r2, #(CONFIG_SYS_MALLOC_LEN)subr2, r2, #(CONFIG_SYS_GBL_DATA_SIZE+8) set base 2 words into abort stackldmiar2, r2 - r3 get pc, cpsraddr0, sp, #S_FRAME_SIZE restore sp_SVCaddr5, sp, #S_SPmovr1, lrstmiar5, r0 - r3 save sp_SVC,

9、lr_SVC, pc, cpsrmovr0, sp.endm.macroirq_save_user_regssubsp, sp, #S_FRAME_SIZEstmiasp, r0 - r12 Calling r0-r12add r7, sp, #S_PCstmdb r7, sp, lr Calling SP, LRstr lr, r7, #0 Save calling PCmrs r6, spsrstr r6, r7, #4 Save CPSRstr r0, r7, #8 Save OLD_R0movr0, sp.endm.macroirq_restore_user_regsldmiasp,

10、r0 - lr Calling r0 - lrmovr0, r0ldrlr, sp, #S_PC Get PCaddsp, sp, #S_FRAME_SIZEsubspc, lr, #4 return & move spsr_svc into cpsr.endm.macro get_bad_stackldrr13, _armboot_start setup our mode stacksubr13, r13, #(CONFIG_STACKSIZE)subr13, r13, #(CONFIG_SYS_MALLOC_LEN)subr13, r13, #(CONFIG_SYS_GBL_DATA_SI

11、ZE+8) reserved a couple spots in abort stackstrlr, r13 save caller lr / spsrmrslr, spsrstr lr, r13, #4movr13, #MODE_SVC prepare SVC-Mode msrspsr_c, r13msrspsr, r13movlr, pcmovspc, lr.endm.macro get_irq_stack setup IRQ stackldrsp, IRQ_STACK_START.endm.macro get_fiq_stack setup FIQ stackldrsp, FIQ_STA

12、CK_START.endm/* exception handlers*/异常向量处理每一个异常向量处其实只放了一条跳转指令(因为每个异常向量只有4个字节不能放太多的程序),跳到相应的异常处理程序中。.align 5undefined_instruction:get_bad_stackbad_save_user_regsbldo_undefined_instruction.align5software_interrupt:get_bad_stackbad_save_user_regsbldo_software_interrupt.align5prefetch_abort:get_bad_stackbad_save_user_regsbldo_prefetch_abort.align5data_abort:get_bad_stackbad_save_user_regsbldo_data_abort.align5not_used:get_bad_stackbad_save_user_regsbldo_not_used#ifdef CONFIG_USE_IRQ.align5irq:get_irq_stackirq_save_user_regsbldo_irqirq_restore_user_regs.align5fiq:get_f

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号