프로그램을 메모리에 적재하는 것도 OS의 역할 중 하나이다.
프로그램을 실행하기 위해서는 적절한 포맷을 가지고 있어야 한다.
여기서 살펴볼 것은 elf 포맷이다.
elf 포멧은 3가지로 나눌 수 있다.
- elf header
- program header table
- section header table
elf : 엔트리 포인트, ...
progrma header : segment list, ...
section : 영역 (.text, .data, ...)
elf header 에는...
e_ident : 매직넘버, 첫 4바이트는 7f 'ELF' 가 들어있다. 7f 는 바이너리이다.
e_endtry : 엔트리 포인트
phoff : 프로그램 헤더 위치
shoff : 세그먼트 헤더 위치 (phoff 랑 같다?)
phnum : 프로그램 헤더 수
shnum : 세그먼트 헤더 수 (phnum 이랑 같다?)
phnum 만큼 루프를 돌면서 메모리에 세그먼트들을 로드하면 된다.
엔트리포인트는 메인함수의 위치와 다르다. 프로그램이 시작되면 스택을 초기화하고 메인함수에 매개변수를 넣는 등의 세팅을 하고 메인 함수를 실행해 주는 코드를 실행하기 때문이다.
segment : 세그먼트 모아놓은 거
section : .text .bss 이런 것들
common sections
따로 조작하지 않아도 디폴트로 사용하는 섹션들
.text : 코드
.bss : 초기화 되지 않은 전역 변수, 자동으로 0으로 초기화 해주기 때문에 .bss 영역이 크면 로딩이 느리다.
.data : 초기화된 전역 변수, 지역 변수
.rodata : read only data, 문자열
.strtab : 함수, 변수 이름 테이블
section header 의 flags 는 권한이다. (w r x)
offset 은 파일에서의 상대적인 위치
.bss header 는 size 는 갖지만 파일에서 읽을 데이터가 없다. 어차피 0으로 다 초기화할 건데 이 데이터들을 파일에서 보관할 필요가 없기 때문이다.
세그먼트가 섹션을 모을 때 규칙이 정해져 있는 것은 아니지만 연관된 섹션들끼리 모은다. 같은 세그먼트는 권한이 동일하게 처리하기 때문이다.
세그먼트 헤더의 vaddr 은 가상 메모리 주소이다.
paddr 은 피지컬 메모리 주소이다.
근데 현대에는 세그먼트 안 쓰고 페이징 쓴다.
프로그램 로더는 세그먼트를 읽어서 메모리에 적재, .bss 영역을 적재하고 0으로 초기화 해주고 스택과 힙을 초기화하고 ESP, EIP 위치를 정해준다.
- 인천대학교 컴퓨터공학부 3학년 전공필수 과목인 박문주 교수님의 운영체제 강의를 듣고 작성한 글입니다.
'공부 > OS' 카테고리의 다른 글
[운영체제] 프로세스 스케줄링 2 (process scheduling) (0) | 2021.04.20 |
---|---|
[운영체제] 프로세스 스케줄링 1 (process scheduling) (0) | 2021.04.19 |
[운영체제] 운영체제 만들기 (0) | 2021.04.19 |
[운영체제] 스레드(thread) (0) | 2021.04.19 |
[운영체제] 컨텍스트 스위칭은 언제 일어나야 하는가? (0) | 2021.04.18 |