오후 12:36 2006-04-26
arm boot
조경민 bro@shinbiro.com
http://neri.cafe24.com
============================================================

;=====================================================
; boot.s
; by bro, bro@shinbiro.com 오전 10:23 2006-04-26
;
;=====================================================

        IMPORT main
        IMPORT ||Image$$BOOT$$ZI$$Limit||
        EXPORT __user_initial_stackheap

        AREA boot, CODE, READONLY
        ENTRY
vector                                ; 인터럽트 벡터 테이블
        b        reset                 ; 주소 0번지에 reset 인터럽트가 오면 바로 reset레이블로 점프
        b        error                 ; undefined_instruction
        b        error                 ; software_interrupt
        b        error                 ; prefetch_abort
        b        error                 ; data_abort
        b        error                 ; not_used
        b        error                 ; IRQ
        b        error                 ; FIQ

error
        b        error

reset
        ; 현재 모드에서 IRQ|FIQ를 끈다.
        mrs     r0, CPSR
        bic     r0, r0, #0x1f
        orr     r0, r0, #(0x13 | 0xc0)        ; 0x13(0001 0011) | 0xC0 (1101 0000) = 0xD3(1101 0011)
        msr     CPSR_cxsf, r0
        ; 스택 초기화        0x9000
        mov        sp, #0x9000

        ldr        pc, =main
        b        end
__user_initial_stackheap
        ;LDR        r0, =||Image$$BOOT$$ZI$$Limit||
        MOV        pc, lr
end
        END
-----------------------------------------------------------------------------
main.c

void main()
{
        int a;
        for( a = 0; a < 10; a = a + 1);
}
-----------------------------------------------------------------------------
memory.map

MEMORY_MAP 0x0
{
        BOOT 0x0
        {
                boot.o (boot, +First)
                main.o
                * (+RO, +RW, +ZI)
        }
}
-----------------------------------------------------------------------------
armasm boot.s -G -o boot.o

armcc -c main.c --arm --debug -g -o main.o
armlink boot.o main.o --map -ro-base 0x0 -entry vector --scatter memory.map -o kernel.axf


처음에는 __user_initial_stackheap 이 요상한 구문이 없었는데 링크하려고하면
Error: L6218E: Undefined symbol Image$$ZI$$Limit (referred from sys_stackheap.o)
에러가 났다.
http://www.arm.com/support/faqdev/1247.html
에서 하라는대로 asm 파일에 추가하니 나지는 않는다.

scatter 파일
여러 object파일을 링크할때 각 object 파일이 실제 실행될때 어디로 로드될지 결정할 수 있다.

region이름 시작주소, [크기]
{
        서브region이름 시작주소, [크기]
        {
                object.o (섹션명,+First)  ;처음에 둔다는 의미
        }

        서브region이름 시작주소, [크기]
        {
                main.o (+RO, +RW) ; ReadOnly와 ReadWrite 섹션만 둔다고 설정가능
                * (+RO, +RW, +ZI) ; main.o의 ZI (Zero Intilaize)와 다른 object들의 모든 섹션이

놓임
        }
}

RO는 보통 실행코드 영역또는 const상수(text), RW는 데이터 영역, ZI는 0으로 초기화되는 변수(static

변수)

memory.map 파일에서 BOOT region과 KERNEL region으로 커널은 0x10000에서 시작하게 하려했는데
실행하면 뭔가 이상하게 안된다. 그래서 일단 BOOT region만 두었다.

MEMORY_MAP 0x0
{
        BOOT 0x0
        {
                boot.o (boot, +First)
                * (+RO)
        }
        KERNEL 0x10000
        {
                main.o (+RO,+RW,+ZI)
                
        }
        OTHER +0
        {
                * (+RW,+ZI)
        }
}

'KB > embbeded sw' 카테고리의 다른 글

arm-5 : task switch 하기  (0) 2006.05.02
arm-4: 커널 영역 올리기  (0) 2006.04.27
arm-2: boot 테스트  (0) 2006.04.26
arm-1: ADS로 ARM 공부 add  (0) 2006.04.25
arm-0: Armulator 사용하기  (0) 2006.04.25

+ Recent posts