운영체제 기본/Linux/ELF 로딩/execve와 실행 이미지 교체: 두 판 사이의 차이

잔글 관리자님이 운영체제 기본/Linux의 ELF 로딩/execve와 실행 이미지 교체 문서를 운영체제 기본/Linux/ELF 로딩/execve와 실행 이미지 교체 문서로 이동했습니다: Linux 각론 제목을 계층형 경로로 통일
Linux 계층형 경로에 맞춰 문서 링크 갱신
 
1번째 줄: 1번째 줄:
{{이전 다음 문서
{{이전 다음 문서
|목차=[[운영체제 기본/Linux의 ELF 로딩|ELF 로딩 목차]]
|목차=[[운영체제 기본/Linux/ELF 로딩|ELF 로딩 목차]]
|다음=다음 문서 →<br />[[운영체제 기본/Linux의 ELF 로딩/ELF 세그먼트와 주소 공간|ELF 세그먼트와 주소 공간]]
|다음=다음 문서 →<br />[[운영체제 기본/Linux/ELF 로딩/ELF 세그먼트와 주소 공간|ELF 세그먼트와 주소 공간]]
}}
}}


28번째 줄: 28번째 줄:
</pre>
</pre>


<code>alloc_bprm()</code>은 실행 파일을 열고, 이번 실행 요청의 준비 상태를 담을 <code>linux_binprm</code> 객체를 만든다. 파일을 여는 내부 경로는 <code>do_open_execat()</code>에서 <code>do_filp_open()</code>으로 이어진다. VFS가 경로를 탐색하여 파일을 열면 커널은 그 결과인 <code>struct file</code>을 보관한다. 이후 로더는 경로 문자열만 보고 동작하는 것이 아니라, 이 열린 파일 객체를 통해 실행 파일을 읽는다. 이름과 열린 파일 객체의 차이는 [[운영체제 기본/Linux의 파일시스템/VFS와 파일 객체|VFS와 파일 객체]]에서 설명한다.<ref name="exec" />
<code>alloc_bprm()</code>은 실행 파일을 열고, 이번 실행 요청의 준비 상태를 담을 <code>linux_binprm</code> 객체를 만든다. 파일을 여는 내부 경로는 <code>do_open_execat()</code>에서 <code>do_filp_open()</code>으로 이어진다. VFS가 경로를 탐색하여 파일을 열면 커널은 그 결과인 <code>struct file</code>을 보관한다. 이후 로더는 경로 문자열만 보고 동작하는 것이 아니라, 이 열린 파일 객체를 통해 실행 파일을 읽는다. 이름과 열린 파일 객체의 차이는 [[운영체제 기본/Linux/파일시스템/VFS와 파일 객체|VFS와 파일 객체]]에서 설명한다.<ref name="exec" />


<code>linux_binprm</code>은 새 프로세스가 아니다. 열린 파일, 새 주소 공간, 인수 문자열을 쌓을 위치 등 로딩 중에 필요한 상태를 묶어 둔 객체다. <code>bprm_mm_init()</code>은 새 주소 공간을 나타내는 <code>mm_struct</code>와 임시 스택 영역을 준비한다. 이때는 아직 현재 프로세스의 주소 공간을 바꾸지 않는다.<ref name="exec" />
<code>linux_binprm</code>은 새 프로세스가 아니다. 열린 파일, 새 주소 공간, 인수 문자열을 쌓을 위치 등 로딩 중에 필요한 상태를 묶어 둔 객체다. <code>bprm_mm_init()</code>은 새 주소 공간을 나타내는 <code>mm_struct</code>와 임시 스택 영역을 준비한다. 이때는 아직 현재 프로세스의 주소 공간을 바꾸지 않는다.<ref name="exec" />
74번째 줄: 74번째 줄:
로딩이 끝나면 ELF 로더는 새 프로그램의 진입 주소와 초기 스택 주소를 사용자 레지스터 상태에 설정한다. 커널 내부 함수들은 반환할 수 있지만, 사용자 모드로 나갈 때 실행할 위치는 이미 바뀌었다. 이것이 “<code>execve()</code>는 성공하면 반환하지 않는다”는 말의 의미다. 이전 프로그램의 호출 다음 줄이 아니라 새 프로그램의 시작 코드가 실행된다.<ref name="elf" />
로딩이 끝나면 ELF 로더는 새 프로그램의 진입 주소와 초기 스택 주소를 사용자 레지스터 상태에 설정한다. 커널 내부 함수들은 반환할 수 있지만, 사용자 모드로 나갈 때 실행할 위치는 이미 바뀌었다. 이것이 “<code>execve()</code>는 성공하면 반환하지 않는다”는 말의 의미다. 이전 프로그램의 호출 다음 줄이 아니라 새 프로그램의 시작 코드가 실행된다.<ref name="elf" />


이제 실행 파일은 열렸고 ELF 로더도 선택되었다. 다음 [[운영체제 기본/Linux의 ELF 로딩/ELF 세그먼트와 주소 공간|ELF 세그먼트와 주소 공간]]에서는 로더가 프로그램 헤더를 읽어 코드와 데이터를 가상 주소 공간에 배치하는 방법을 살펴본다.
이제 실행 파일은 열렸고 ELF 로더도 선택되었다. 다음 [[운영체제 기본/Linux/ELF 로딩/ELF 세그먼트와 주소 공간|ELF 세그먼트와 주소 공간]]에서는 로더가 프로그램 헤더를 읽어 코드와 데이터를 가상 주소 공간에 배치하는 방법을 살펴본다.


== 참고 문헌 ==
== 참고 문헌 ==
80번째 줄: 80번째 줄:


{{이전 다음 문서
{{이전 다음 문서
|목차=[[운영체제 기본/Linux의 ELF 로딩|ELF 로딩 목차]]
|목차=[[운영체제 기본/Linux/ELF 로딩|ELF 로딩 목차]]
|다음=다음 문서 →<br />[[운영체제 기본/Linux의 ELF 로딩/ELF 세그먼트와 주소 공간|ELF 세그먼트와 주소 공간]]
|다음=다음 문서 →<br />[[운영체제 기본/Linux/ELF 로딩/ELF 세그먼트와 주소 공간|ELF 세그먼트와 주소 공간]]
}}
}}


{{운영체제 기본 둘러보기}}
{{운영체제 기본 둘러보기}}