核心初始化程序

1.start.S

.text
.global _start
_start:
    b reset
    ldr pc,_undefined_instruction
    ldr pc,_software_interrupt
    ldr pc,_prefetch_abort
    ldr pc,_data_abort
    ldr pc,_not_used
    ldr pc,_irq
    ldr pc,_fiq

_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq


undefined_instruction:
    nop

software_interrupt:
    nop

prefetch_abort:
    nop

data_abort:
    nop

not_used:
    nop

irq:
    nop

fiq:
    nop

reset:
    bl set_svc
    bl disable_watchdog
    bl disable_interrupt
    bl disable_mmu

set_svc:
    mrs r0,cpsr
    bic r0,r0,#0x1f
    orr r0,r0,#0xd3
    msr cpsr,r0
    mov pc,lr

#define pWACON    0x7e004000
disable_watchdog:
    ldr r0,=pWACON
    mov r1,#0x0
    str r1,[r0]
    mov pc,lr

disable_interrupt:
    mvn r1,#0x0
    ldr r0,=0x71200014
    str r1,[r0]

    ldr r0,=0x71300014
    str r1,[r0]

    mov pc,lr

disable_mmu:
    mcr p15,0,r0,c7,c7,0
    
    mrc p15,0,r0,c1,c0,0
    bic r0,r0,#0x00000005
    mcr p15,0,r0,c1,c0,0

    mov pc,lr

2.xboot.lds

OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    . = 0X5000000;

    . = ALIGN(4);
    .text :
    {
        start.o(.text)
        *(.text)
    }

    . = ALIGN(4);
    .data :
    {
        *(.data)
    }

    . = ALIGN(4);
    bss_start = .;
    .bss :
    {
        *(.bss)
    }
    bss_end = .;
}

3.Makefile

all : start.o
    arm-linux-ld -Txboot.lds -o xboot.elf $^
    arm-linux-objcopy -O binary xboot.elf xboot.bin

%.o : %.c
    arm-linux-gcc -g -c $^

%.o : %.S
    arm-linux-gcc -g -c $^

.PHONY : clean
clean:
        rm *.o *.bin *.elf

 

posted on 2016-08-12 19:38  LeoSanford  阅读(333)  评论(0编辑  收藏  举报

levels of contents