ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C 런타임
    프로젝트/운영체제 만들기 2023. 6. 4. 17:55

    글의 참고

    - https://en.wikipedia.org/wiki/Crt0

    - https://www.embecosm.com/appnotes/ean9/html/ch05s02.html

    - https://wiki.osdev.org/Creating_a_C_Library#Program_Initialization


    글의 전제

    - 내가 글을 쓰다가 궁금한 점은 파란색 볼드체로 표현했다. 나도 모르기 때문에 나중에 알아봐야 할 내용이라는 뜻이다.

    - 밑줄로 작성된 글은 좀 더 긴 설명이 필요해서 친 것이다. 그러므로, 밑 줄 처친 글이 이해가 안간다면 링크를 따라서 관련 내용을 공부하자.

    - `글의 참조`에서 빨간색 볼드체로 체크된 링크는 이 글을 작성하면 가장 많이 참조한 링크다.

    - `운영체제 만들기` 파트에서 퍼온 모든 참조 글들과 그림은 반드시 `이 글과 그림을 소스 코드로 어떻게 구현을 해야할까` 라는 생각으로 정말 심도있게 잠시 멈춰서 생각해봐야 실력이 발전한다.


    글의 내용

    : HOSTED 환경에서 C 프로그램이 빌드되면 최종 결과물의 엔트 포인트는 무조건 main() 함수다. 그 이유는 crt0 때문이다. crt0는 흔히 `startup routines` 라고 불린다. crt0는 메인 함수가 호출되기 전에 런타임 초기화 작업을 진행한다. 초기화 작업의 대표적인 업무로 해당 프로그램의 스택 프레임을 만들어준다.

     

    : 스택 초기화는 당연히 어셈블리언어로만 할 수 있기 때문에, crt0는 어셈블리언어로 작성된다. `crt0`는 대개 오브젝트 파일 형식(crt0.o)으로 존재하고 있으며, 링커에 의해서 명시적으로 작성하지 않아도 자동으로 모든 실행 파일에 포함된다.  crt는 `C Runtime`의 약자이며, 숫자 `0`은 가장 앞에서 앞에서 Runtime 초기화를 진행하기 때문에 붙은 이름이다. crt1, crt2, crt3도 있다. 

     

    : C runtime 예시는 다음과 같다. 보다시피 실행되는 프로그램의 스택 프레임의 초기화를 진행하고, 메인 함수를 호출하는 것이 주업무이다.

    text
    
    .globl _start
    
    _start: # _start is the entry point known to the linker
        xor %ebp, %ebp            # effectively RBP := 0, mark the end of stack frames
        mov (%rsp), %edi          # get argc from the stack (implicitly zero-extended to 64-bit)
        lea 8(%rsp), %rsi         # take the address of argv from the stack
        lea 16(%rsp,%rdi,8), %rdx # take the address of envp from the stack
        xor %eax, %eax            # per ABI and compatibility with icc
        call main                 # %edi, %rsi, %rdx are the three args (of which first two are C standard) to main
    
        mov %eax, %edi    # transfer the return of main to the first argument of _exit
        xor %eax, %eax    # per ABI and compatibility with icc
        call _exit        # terminate the program

    : crt0의 시작이 `_start` 심볼로 시작하는 것에 주목할 필요가 있다.

    '프로젝트 > 운영체제 만들기' 카테고리의 다른 글

    [x86] 인터럽트  (0) 2023.06.05
    권한  (0) 2023.06.05
    크로스 컴파일[작성중]  (0) 2023.06.03
    GCC[작성중]  (0) 2023.06.02
    GIT 명령어  (1) 2023.06.01
Designed by Tistory.