7.9 Loading Executable Object Files(실행 가능한 객체 파일 로딩)
- executable object file prog를 실행시키기 위해서 Linux shell의 command line에 아래와 같이 하면 된다.
linux> ./prog
- prog는 내장된 shell 명령어가 아니기 때문에 shell은 prog가 executable object file이라고 가정한다. 이것은 loader라고 알려진 memory resident OS code에 의해서 실행이 된다.
- 모든 Linux 프로그램은 execve 함수를 호출해서 loader를 실행할 수 있다.
- loader는 executable object file에 있는 code와 data를 disk에서 메모리로 복사한다.
- 그리고 첫번째 명령어나 entry point로 가서 프로그램을 실행한다.
- 이런 프로그램을 메모리로 복사하고 실행시키는 process를 loading이라고 한다.
- 모든 실행중인 Linux 프로그램은 아래 그림과 비슷한 run time memory를 가지고 있다.
- Linux x86-64 시스템에서 code segment는 0x400000 주소에서 시작하고 이 뒤에 data segment가 있다.
- run time heap은 data segment 뒤에 있고 malloc 라이브러리 호출하면 위로 자라난다.
- 그 다음에 shared modules를 위한 영역이 있다.
- user stack은 가장 큰 주소에서부터 시작해서 아래로 자란다.
- stack 위에 있는 영역은 2^48주소에서 시작하는데 이것은 kernel의 code와 data를 위해 지정된 영역이다. 이것은 OS의 memory-resident 부분이다.
- 간단하게 heap, data, code segment를 붙여서 그렸고 가장 큰 user address에 stack의 top을 위치시켰다.
- 실제로 code와 data segment 사이에 gap이 있는데 .data segment의 alignment requirement 때문이다.
- 또한 linker는 stack, shared library, heap segment에 run time address를 할당할 때 address space layout randomization (ASLR)이라는 방법을 사용한다. 3.10.4
- 프로그램이 실행될 때마다 이 영역의 위치는 바뀌지만 상대적인 위치는 동일하다.
- loader가 실행이 되면 loader는 위의 그림과 비슷하게 memory image를 생성해낸다.
- program header table에 따라 loader는 executable object file의 chunk를 code, data segment에 복사한다.
- 그리고 loader는 프로그램의 entry point로 이동한다. entry point는 항상 _start 함수의 주소다.
- _start 함수는 system object file crt1.o에 정의되어있고 모든 C 프로그램에게 동일하다.
- _start 함수는 시스템 startup 함수인 _libc_start main 호출한다. _libc_start main 함수는 libc.so에 정의되어 있다.
- _libc_start main함수는 실행 환경을 초기화 하고 user level의 main 함수를 호출하고 main 함수의 반환 값을 처리하고 필요하면 kernel에게 control을 반환한다.
'Computer Science > 컴퓨터 구조' 카테고리의 다른 글
[CSAPP] 8.4 Process Control(프로세스 컨트롤) (0) | 2023.02.27 |
---|---|
[CSAPP] 8.5 Signal(시그널) (0) | 2023.02.22 |
[CSAPP] 7.8 Executable Object Files(실행 가능한 객체 파일) (0) | 2023.02.21 |
[CSAPP] 7.7 Relocation(재배치) (0) | 2023.02.21 |
[CSAPP] 7.6 Symbol Resolutions(심볼 해석) (0) | 2023.02.21 |