본문 바로가기
한국으로/ARM

C Runtime Startup

by 영킴. 2018. 7. 21.

C Runtime Startup


crt0

crt0는 C로 작성된 프로그램의 메인 함수를 호출하기 전에 필요한 초기화를 수행하는 루틴의 집합으로 프로그램에 링크되어 있다. 보통 어셈블리어로 작성되며, 빌드 시에 링커에 의해 자동으로 실행 파일에 포함된다.

crt0는 runtime 라이브러리의 가장 기본적인 부분을 포함한다. 정확히 하는 일은 프로그램의 컴파일러, 운영체제 그리고 C 표준 라이브러리의 구현에 달려 있다. 환경과 툴체인에 필요한 초기화 작업 외에도, crt0는 C++의 전역 생성자나 GCC의 ((constructor)) 속성을 포함하는 C 함수를 실행하는 것 같이 프로그래머에 의해 정의된 추가적인 작업을 할 수 있다.



XIP (Execute in Place)

XIP는 메모리 상에서 직접 프로그램/코드를 실행할 수 있는 기술. Random Access가 가능해야 하기 때문에, RAM 위에서 동작한다.

1. ROM에 있는 변수를 RAM에 복사 (수정 가능해짐)
2. BSS를 0으로 초기화
3. 스택 포인터 지정하기
4. Main 함수 호출


XIP는 부팅이 빠르지만 실행이 느리다. ROM에 있는 압축된 실행 파일을 실행. Non-Bootable 메모리(HDD, NAND, SD 등)에 있는 실행파일을 실행. 여러 응용 프로그램을 선택적으로 실행할 수 있다.




RAM Loading

RAM Loading 에서는 코드가 이미 RAM에 위치하고 있기 때문에 ROM에서 복사해올 필요가 없다. 모두 RAM에 올라가고 RAM에서 실행함.


RAM Loading은 실행이 빠르지만 부팅이 느리다. 시스템에 Bootable 메모리가 적거나 없어도 NAND Boot이 가능하다. Boot Loader가 필요함.




Freestanding 방식 CRT-Startup 코드 예제

Freestanding 환경: 프로그래머가 임의의 방식으로 사용자 프로그램을 구동.
임베디드의 경우 Semi Hosting 환경 사용 (Hosting 환경: C 표준에서 지정한 규칙에 의거하여 사용자 프로그램 구동, Main 함수 시작)


    .extern __RO_LIMIT__
    .extern __RW_BASE__
    .extern __ZI_BASE__
    .extern __ZI_LIMIT__

    ldr r0, =__RO_LIMIT__
    ldr r1, = __RO_BASE__
    ldr r3, = __ZI_BASE__

    cmp r0, r1
    beq 2f

1:
    cmp r1, r3
    ldrlo r2, [r0], #4
    strlo r2, [r1], #4
    blo 1b

2:
    ldr r1, =__ZI_BASE__
    mov r2, #0

3:
    cmp r3, r1
    strlo r2, [r3], #4
    blo 3b