Linux의 main()은 누가 실행합니까?

Linux의 main()은 누가 실행합니까?

Linux 0.11에서는 main.c와 main()이 있는 것을 볼 수 있습니다.

내가 이해한 바로는 대상 코드를 실행하려면 운영 체제가 필요합니다.

내 말은, Linux 0.11은 운영 체제이기 때문에 그 이전에는 누가 실행했습니까? 도스?

답변1

이름은 단순히 친숙함과 미학적 이유로 선택되었습니다 . 사용자 공간 프로그램에서 호출할 수 있는 main()C 런타임이 없습니다 . main()이를 설명하는 의견도 있습니다 init/main.c.

void main(void)         /* This really IS void, no error here. */

함수 main()는 다음에서 호출됩니다 boot/head.s.

after_page_tables:
        pushl $0                # These are the parameters to main :-)
        pushl $0
        pushl $0
        pushl $L6               # return address for main, if it decides to.
        pushl $_main
        jmp setup_paging
L6:
        jmp L6                  # main should never return here, but
                                # just in case, we know what happens

의 주소가 main스택에 푸시되는 방법과 using 대신 setup_pagingcall을 사용하는 방법에 주목하세요. 즉 , 끝에 있는 주소가 의 시작 부분부터 계속된다는 뜻입니다 .jmpcallretmain()

답변2

특히 0.11 시대의 Linux 커널은 하드웨어 BIOS에 의해 직접 로드됩니다.

기본적으로 BIOS는 플로피 디스크의 부트 섹터나 하드 디스크의 마스터 부트 레코드를 보고 해당 섹터를 로드합니다. 하드 디스크의 경우 MBR은 "주 파티션" 부팅 섹터를 로드합니다.

이 로드된 부트 섹터에는 커널을 메모리에 로드하고 실행하는 방법을 알 수 있는 충분한 정보가 있습니다.

이전 0.11 디스크에서는 본질적으로 한 디스크에 커널이 있고 다른 디스크에 루트 디렉터리가 있는 플로피 부팅 솔루션이었으므로 시스템 부팅이 매우 매우 간단했습니다.

Linux가 하드 드라이브를 처리하는 동안 부팅 프로세스는 매우 간단합니다. Linux 커널을 로드하고 부팅하여 BIOS 로더를 에뮬레이션할 수 있는 간단한 DOS 프로그램인 "loadlin"과 같은 도구를 만들 수 있을 정도로 매우 간단합니다. 이는 DOS 또는 Linux를 부팅하는 초기 형태의 이중 부팅을 위한 DOS config.sys 메뉴를 생성합니다.

그러나 본질적으로 Linux 커널은 "베어 메탈"에서 로드되어 시스템을 인수합니다.

답변3

함수는 mainC언어의 특징입니다. CPU가 "여기에서 시작"하라는 컴퓨터 명령으로 정확히 변환되는 방법은 기본적으로 컴파일러 구현 세부 사항입니다. 베어메탈에서는 일반적으로 처음 부팅할 때 하드웨어에 의존하여 특정 메모리 주소에서 실행을 시작할 수 있습니다. 초기 버전의 Linux는 .simple x86 부트로더에 의존했으며 현재는 일반적으로 Grub이 해당 역할을 담당합니다. 이 동작은 BIOS 펌웨어 규칙에 따라 다르지만 실제로 모든 수준에는 프로그램 시작 방법에 대한 규칙이 포함된 컴퓨터 아키텍처가 있습니다.

관련 정보