운영체제 기본/Linux의 ELF 로딩/초기 스택과 사용자 모드 진입: 두 판 사이의 차이

BIOS GRUB 부팅 경로 보강과 각론 형식 통일
BIOS 부팅·i8042 키보드 각론의 새 문서명으로 내부 링크 갱신
122번째 줄: 122번째 줄:
== 첫 init은 커널에서 이 과정을 시작한다 ==
== 첫 init은 커널에서 이 과정을 시작한다 ==


부팅 중 PID 1은 아직 이전 사용자 프로그램을 실행한 적이 없으므로, 사용자 코드가 시스템 콜을 호출하는 방식으로 시작할 수 없다. 어떤 파일을 init으로 선택하는지는 [[운영체제 기본/x86-64 Linux의 부팅/루트 파일시스템과 init 선택|루트 파일시스템과 init 선택]]에서 다루고, 여기서는 선택된 파일을 실행하는 연결만 살펴본다.
부팅 중 PID 1은 아직 이전 사용자 프로그램을 실행한 적이 없으므로, 사용자 코드가 시스템 콜을 호출하는 방식으로 시작할 수 없다. 어떤 파일을 init으로 선택하는지는 [[운영체제 기본/x86-64 Linux의 BIOS 부팅/루트 파일시스템과 init 선택|루트 파일시스템과 init 선택]]에서 다루고, 여기서는 선택된 파일을 실행하는 연결만 살펴본다.


PID 1 태스크는 먼저 커널의 <code>kernel_init()</code>를 수행한다. 여기서 <code>run_init_process()</code>가 <code>kernel_execve()</code>를 호출한다. 사용자 시스템 콜 입구를 통과하지 않는다는 차이는 있지만, 공통 exec 처리와 ELF 로더를 통해 주소 공간, 초기 스택, 저장된 사용자 레지스터를 준비하는 원리는 같다.<ref name="init">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/init/main.c?h=v6.12 Linux v6.12, init/main.c], <code>rest_init()</code>, <code>kernel_init()</code>, <code>run_init_process()</code>.</ref>
PID 1 태스크는 먼저 커널의 <code>kernel_init()</code>를 수행한다. 여기서 <code>run_init_process()</code>가 <code>kernel_execve()</code>를 호출한다. 사용자 시스템 콜 입구를 통과하지 않는다는 차이는 있지만, 공통 exec 처리와 ELF 로더를 통해 주소 공간, 초기 스택, 저장된 사용자 레지스터를 준비하는 원리는 같다.<ref name="init">[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/init/main.c?h=v6.12 Linux v6.12, init/main.c], <code>rest_init()</code>, <code>kernel_init()</code>, <code>run_init_process()</code>.</ref>