일부 소스 코드를 읽고 그것이 어떻게 조화를 이루는지 이해하려고 노력하고 싶지만 어디서부터 시작해야 할지 모르겠습니다. Linux 소스 코드에서 커널 컴파일을 위한 주요 파일은 무엇입니까?
원래 하나 찾고 싶었는데 kernel/main.c
밑에 파일이 너무 많아서 kernel/
어떤게 메인인지 모르겠나요? 응 kernel/sys.c
?
답변1
부트로더에서 커널로 전환하려면 반드시 메모리 주소 및 레지스터 사용과 같은 일부 아키텍처 관련 고려 사항이 필요합니다. 따라서 찾아야 할 위치는 아키텍처별 디렉터리( arch/*
)입니다. 또한 부트로더에서 전환하려면 어셈블러에서 구현될 수 있는 정확한 레지스터 사용 프로토콜이 필요합니다. 일부 아키텍처에서는 커널이 다양한 부트 로더에 대해 서로 다른 진입점을 갖기도 합니다.
예를 들어 x86에서 진입점은 다음과 같습니다.arch/x86/boot/header.S
(다른 진입점은 모르겠지만 존재하는지 확실하지 않습니다.) 실제 진입점은_start
바이너리 파일의 오프셋 512에 태그 추가. 처음 512바이트는 만들기에 사용할 수 있습니다.마스터 부트 레코드IBM PC 호환 BIOS의 경우(과거에는 커널을 이런 방식으로 부팅할 수 있었지만 지금은 이 부분에 오류 메시지만 표시됩니다). 태그는 _start
다소 긴 처리를 시작합니다.리얼 모드, 먼저 조립하고그 다음에존재하다main.c
. 특정 시점에 코드 초기화보호 모드로 전환. 커널이 이렇다면 여기가 압축해제가 일어나는 지점인 것 같아요압축;그러면 컨트롤이 도달합니다.startup_32
또는startup_64
arch/x86/kernel/head_*.S
32비트 커널인지 64비트 커널인지 에 따라 다릅니다 . 좀 더 조립한 후,i386_start_kernel
존재하다head32.c
또는x86_64_start_kernel
존재하다head64.c
호출됩니다. 마지막으로, 아키텍처 독립적start_kernel
기능하다init/main.c
호출됩니다.
start_kernel
커널이 현실 세계를 준비하기 시작하는 곳입니다. 시작되면 CPU 한 개와 일부 메모리만 있습니다(가상 메모리의 경우 MMU는 이 시점에 이미 켜져 있습니다). 여기에 있는 코드는 메모리 맵을 설정하고, 모든 하위 시스템을 초기화하고, 인터럽트 핸들러를 설정하고, 스레드가 생성될 수 있도록 스케줄러를 시작하고, 주변 장치와 상호 작용을 시작하는 등의 작업을 수행합니다.
부트로더 외에도 커널에는 멀티 코어 CPU에서 커널을 활성화할 때의 진입점, 인터럽트 핸들러, 시스템 호출 핸들러, 오류 핸들러 등 다른 진입점이 있습니다.
답변2
start_kernel()
보려고 노력하다/init/main.c
. 메모리 페이징 등 일부 기본 기능을 설정한 후 부트로더에서 호출하는 기능입니다.
자세한 배경 정보는 다음을 참조하세요.WikipediaLinux 시작 프로세스.