-
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