운영체제 기본/Linux/ELF 로딩/초기 스택과 사용자 모드 진입: 두 판 사이의 차이
잔글 관리자님이 운영체제 기본/Linux의 ELF 로딩/초기 스택과 사용자 모드 진입 문서를 운영체제 기본/Linux/ELF 로딩/초기 스택과 사용자 모드 진입 문서로 이동했습니다: Linux 각론 제목을 계층형 경로로 통일 |
Linux 계층형 경로에 맞춰 문서 링크 갱신 |
||
| 1번째 줄: | 1번째 줄: | ||
{{이전 다음 문서 | {{이전 다음 문서 | ||
|이전=← 이전 문서<br />[[운영체제 기본/ | |이전=← 이전 문서<br />[[운영체제 기본/Linux/ELF 로딩/ELF 세그먼트와 주소 공간|ELF 세그먼트와 주소 공간]] | ||
|목차=[[운영체제 기본/ | |목차=[[운영체제 기본/Linux/ELF 로딩|ELF 로딩 목차]] | ||
}} | }} | ||
[[운영체제 기본/ | [[운영체제 기본/Linux/ELF 로딩/ELF 세그먼트와 주소 공간|ELF 세그먼트와 주소 공간]]에서는 실행 파일의 코드·데이터와 BSS를 프로세스의 가상 주소 공간에 배치했다. 다음으로 필요한 것은 '''프로그램에 전달할 인자와 스택을 만들고, 어느 명령어부터 실행할지 CPU의 복귀 상태에 기록하는 것'''이다. | ||
여기서도 정적 링크된 <code>ET_EXEC</code>를 먼저 설명한다. 앞의 예처럼 코드가 <code>0x401000</code>에 배치되고 ELF 헤더의 <code>e_entry</code>도 <code>0x401000</code>이라면, 이 주소가 새 프로그램의 첫 실행 주소이다. 기준 구현은 Linux v6.12의 x86-64와 RISC-V RV64이다. 실행 파일의 명령어와 대상 아키텍처 정보는 각각의 CPU에 맞아야 한다. | 여기서도 정적 링크된 <code>ET_EXEC</code>를 먼저 설명한다. 앞의 예처럼 코드가 <code>0x401000</code>에 배치되고 ELF 헤더의 <code>e_entry</code>도 <code>0x401000</code>이라면, 이 주소가 새 프로그램의 첫 실행 주소이다. 기준 구현은 Linux v6.12의 x86-64와 RISC-V RV64이다. 실행 파일의 명령어와 대상 아키텍처 정보는 각각의 CPU에 맞아야 한다. | ||
| 115번째 줄: | 115번째 줄: | ||
따라서 커널 내부의 exec 처리 함수가 성공을 반환하는 것과, 이전 사용자 프로그램의 <code>execve()</code> 호출 다음 줄로 돌아가는 것은 다르다. 성공한 exec는 이전 프로그램으로 돌아가지 않는다. 현재 태스크의 실행 이미지가 바뀌는 것이므로 새 프로세스를 만드는 동작도 아니며, 다른 태스크로 CPU를 넘기는 컨텍스트 스위치(Context Switch)와도 구별된다. | 따라서 커널 내부의 exec 처리 함수가 성공을 반환하는 것과, 이전 사용자 프로그램의 <code>execve()</code> 호출 다음 줄로 돌아가는 것은 다르다. 성공한 exec는 이전 프로그램으로 돌아가지 않는다. 현재 태스크의 실행 이미지가 바뀌는 것이므로 새 프로세스를 만드는 동작도 아니며, 다른 태스크로 CPU를 넘기는 컨텍스트 스위치(Context Switch)와도 구별된다. | ||
첫 명령어를 가져올 때 해당 코드 페이지가 아직 연결되지 않았다면 페이지 폴트가 발생할 수 있다. 커널이 페이지를 준비한 뒤 같은 명령어 접근을 재개하므로, 이것도 정상적인 시작 과정의 일부이다. 자세한 내용은 [[운영체제 기본/ | 첫 명령어를 가져올 때 해당 코드 페이지가 아직 연결되지 않았다면 페이지 폴트가 발생할 수 있다. 커널이 페이지를 준비한 뒤 같은 명령어 접근을 재개하므로, 이것도 정상적인 시작 과정의 일부이다. 자세한 내용은 [[운영체제 기본/Linux/메모리 매핑/페이지 폴트 처리|페이지 폴트 처리]]로 이어진다. | ||
<code>e_entry</code>는 보통 C의 <code>main()</code> 주소가 아니다. 일반적인 C 프로그램은 <code>_start</code> 같은 런타임 시작 코드에서 스택의 인자 정보를 읽고 실행 환경을 준비한 뒤 <code>main()</code>을 호출한다. ELF가 <code>_start</code>라는 이름을 강제하는 것도 아니다. 커널은 함수 이름을 찾지 않고 ELF에 기록된 진입 주소를 사용한다. | <code>e_entry</code>는 보통 C의 <code>main()</code> 주소가 아니다. 일반적인 C 프로그램은 <code>_start</code> 같은 런타임 시작 코드에서 스택의 인자 정보를 읽고 실행 환경을 준비한 뒤 <code>main()</code>을 호출한다. ELF가 <code>_start</code>라는 이름을 강제하는 것도 아니다. 커널은 함수 이름을 찾지 않고 ELF에 기록된 진입 주소를 사용한다. | ||
| 130번째 줄: | 130번째 줄: | ||
{{이전 다음 문서 | {{이전 다음 문서 | ||
|이전=← 이전 문서<br />[[운영체제 기본/ | |이전=← 이전 문서<br />[[운영체제 기본/Linux/ELF 로딩/ELF 세그먼트와 주소 공간|ELF 세그먼트와 주소 공간]] | ||
|목차=[[운영체제 기본/ | |목차=[[운영체제 기본/Linux/ELF 로딩|ELF 로딩 목차]] | ||
}} | }} | ||
{{운영체제 기본 둘러보기}} | {{운영체제 기본 둘러보기}} | ||