운영체제 기본/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> | ||