소스 파일을 보십시오. Linux는 어디에서 실행을 시작합니까?

소스 파일을 보십시오. Linux는 어디에서 실행을 시작합니까?

일부 소스 코드를 읽고 그것이 어떻게 조화를 이루는지 이해하려고 노력하고 싶지만 어디서부터 시작해야 할지 모르겠습니다. 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_64arch/x86/kernel/head_*.S32비트 커널인지 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 시작 프로세스.

관련 정보