부팅 프로세스 후 Linux 커널 이미지가 RAM에 로드된 후 발생하는 활동 흐름을 알고 싶습니다.
답변1
Linux 2.6부터:
핵심
RAM에 로드된 후 커널은 다음 기능을 수행합니다.
setup()
:
- 물리적 메모리의 레이아웃을 설명하기 위해 RAM에 테이블을 만듭니다.
- 키보드 반복 지연 및 속도를 설정합니다.
- 비디오 어댑터 카드를 초기화합니다.
- 하드 디스크 매개변수를 사용하여 디스크 컨트롤러를 초기화합니다.
- IBM 마이크로 채널 버스를 확인하십시오.
- PS/2 포인팅 장치(버스 마우스)를 확인하십시오.
- 고급 전원 관리(APM) 지원을 확인하세요.
- 지원되는 경우 사용 가능한 하드 디스크를 설명하는 테이블을 RAM에 작성하십시오.
- 커널 이미지가 RAM에서 더 낮은 위치에 로드되면 더 높은 위치로 이동하세요.
- A20 핀을 설정합니다(고대 8088 마이크로프로세서에 대한 호환성 수정).
- 임시 인터럽트 설명자 테이블(IDT)과 임시 전역 설명자 테이블(GDT)을 설정합니다.
- 부동 소수점 단위(FPU)를 재설정합니다.
- 프로그래밍 가능한 인터럽트 컨트롤러(PIC)를 다시 프로그래밍하십시오.
- 리얼 모드에서 보호 모드로 전환합니다.
startup_32()
:
- 분할 레지스터와 임시 스택을 초기화합니다.
eflags
레지스터의 모든 비트를 지웁니다 .- 초기화되지 않은 데이터 영역을 0으로 채웁니다.
decompress_kernel()
커널 이미지의 압축을 풀기 위해 호출됩니다 .
startup_32()
(같은 이름, 다른 기능):
- 최종 분할 레지스터를 초기화합니다.
bss
세그먼트를 0으로 채웁니다 .- 임시 커널 페이지 테이블을 초기화합니다.
- 페이징을 활성화합니다.
- 프로세스 0에 대한 커널 모드 스택을 설정합니다.
eflags
레지스터의 모든 비트를 다시 지웁니다.- IDT를 빈 인터럽트 핸들러로 채웁니다.
- 시스템 매개변수를 사용하여 첫 번째 페이지 프레임을 초기화합니다.
- 프로세서 모델을 결정합니다.
- GDT와 IDT의 주소를 사용하여 레지스터를 초기화합니다.
start_kernel()
: 거의 모든 커널 구성 요소가 이 함수에 의해 초기화되며 이는 단지 몇 가지에 불과합니다.
- 스케줄러
- 메모리 영역
- 친구 시스템 할당자
- 이온 교환 기술
- 소프트 IRQ
- 날짜와 시간
- 슬래브 분배기
- 프로세스 1 생성(
/sbin/init
)
전체 "목록"은 다음에서 확인할 수 있습니다.리눅스/init/main.c
내부에
Init는 시스템을 원하는 상태로 만드는 데 필요한 모든 사용자 프로세스를 시작합니다. 이 루틴은 호출되는 실행 레벨과 할당에 크게 의존합니다.
runlevel
콘솔에 뭔가를 입력하면 시스템의 현재 런레벨이 표시됩니다.
보기 /etc/rcX.d/
(또는 /etc/rc.d/rcX.d/
)에서 X를 런레벨로 바꾸세요.
실행 우선순위에 따라 정렬된 기호 링크입니다. S01....
즉, 스크립트는 시작 프로세스 초기에 시작되어 S99....
시작 프로세스가 끝날 때 실행됩니다. 심볼릭 KXX....
링크는 동일한 작업을 수행하지만 종료 시퀀스에 대한 것입니다.
일반적으로 이러한 스크립트는 디스크, 네트워크, 로깅, 장치 제어, 특수 드라이버, 환경 및 기타 여러 필수 시퀀스를 처리합니다.
답변2
- "Uncompressing Linux.."가 표시되면 커널이 시스템 하드웨어 제어권을 인수한 것입니다.
- 커널은 그래픽 카드의 BIOS 레지스터와 화면 출력 형식을 확인하고 설정합니다.
- 그런 다음 커널은 BIOS 설정을 읽고 기본 하드웨어 인터페이스를 초기화합니다.
- 다음으로 커널의 드라이버가 하드웨어를 초기화합니다.
- 그런 다음 커널은 파티션을 확인합니다.
- 그런 다음 루트 파일 시스템을 마운트합니다.
- 그런 다음 커널은 init를 시작하여 기본 시스템과 모든 프로그램 및 구성을 시작합니다.
답변3
부트로더는 커널 명령줄(사용 가능한 경우)을 통해 이미지 진입점으로 점프하고 커널이 나머지를 처리합니다.