source

Linux 커널은 어떻게 컴파일 할 수 있습니까?

goodcode 2022. 8. 11. 22:18
반응형

Linux 커널은 어떻게 컴파일 할 수 있습니까?

컴퓨터에 Linux 시스템을 설치할 때 Linux 커널의 컴파일 프로세스를 잘 이해하지 못합니다.

다음은 저를 혼란스럽게 하는 몇 가지 사항입니다.

  1. 커널은 C로 되어 있는데 컴파일러가 설치되지 않은 상태에서 어떻게 커널이 컴파일 되었습니까?
  2. 커널이 컴파일되기 전에 C 컴파일러가 컴퓨터에 설치되어 있다면 컴파일러 자체가 컴파일러가 설치되지 않은 상태에서 컴파일러가 어떻게 컴파일될 수 있을까요?

며칠 동안 너무 혼란스러웠어요, 답장 고마워요.

Linux 박스용 첫 번째 바이너리 라운드는 다른 Linux 박스(아마도)에 구축되어 있습니다.

최초의 Linux 시스템의 바이너리는 다른 플랫폼에 구축되었습니다.

해당 컴퓨터의 바이너리는 루트를 추적하여 다른 플랫폼에 구축된 원래 시스템으로 되돌릴 수 있습니다.

...

이 정도만 누르면 더 원시적인 도구로 만들어진 컴파일러를 찾을 수 있습니다. 컴파일러는 호스트 이외의 머신에 구축되어 있습니다.

...

계속 누르면 기계 전면 패널에 스위치를 설정하여 명령을 입력할 수 있도록 만들어진 컴퓨터를 찾을 수 있습니다.

아주 멋진 것.

규칙은 "툴을 구축하기 위한 툴을 구축합니다.③ 물리적인 환경을 가동하는 툴과 매우 유사합니다."부트스트랩으로 자신을 끌어올린다"라고도 합니다.

다음 항목을 구분해야 합니다.

컴파일, v: 컴파일러를 사용하여 소스 코드를 처리하고 실행 가능한 코드를 생성합니다 [1].

그리고.

설치, v: 연결, 설정 또는 사용을 위한 준비 [2]

컴파일은 소스 코드에서 바이너리 실행 파일을 생성합니다.설치에서는 바이너리 실행 파일을 나중에 실행할 수 있는 적절한 위치에 배치할 뿐입니다.따라서 바이너리를 사용할 수 있는 경우 설치 및 사용에 컴파일이 필요하지 않습니다.「컴파일」과 「인스톨」을 각각 「쿡」과「서비스」와 같이 생각해 주세요.

이제 질문 드리겠습니다.

  1. 커널은 C로 되어 있는데 컴파일러가 설치되지 않은 상태에서 어떻게 커널이 컴파일 되었습니까?

커널은 컴파일러 없이 컴파일할 수 없지만 컴파일된 바이너리에서 설치할 수 있습니다.

통상, operating system을 인스톨 할 때는, 미리 컴파일 된 커널(바이너리 실행 파일)을 인스톨 합니다.그것은 다른 사람에 의해 편집되었다.또한 커널을 직접 컴파일하고 싶은 경우에만 소스 및 컴파일러 및 기타 모든 툴이 필요합니다.

gentoo와 같은 "소스 기반" 배포에서도 컴파일된 바이너리 실행부터 시작합니다.

커널을 컴파일하지 않고평생 살 수 있습니다다른 사람이 컴파일했기 때문입니다

  1. 커널이 컴파일되기 전에 C 컴파일러가 컴퓨터에 설치되어 있다면 컴파일러 자체가 컴파일러가 설치되지 않은 상태에서 컴파일러가 어떻게 컴파일될 수 있을까요?

커널(OS)이 없으면 컴파일러를 실행할 수 없습니다.따라서 컴파일러를 실행하기 위해 컴파일된 커널을 설치해야 하지만 커널을 직접 컴파일할 필요는 없습니다.

여기서 가장 일반적인 방법은 컴파일러의 컴파일된 바이너리를 설치하고 컴파일러 자체와 커널을 포함한 다른 모든 컴파일에 사용하는 것입니다.

자, 닭과 달걀 문제.첫 번째 이진수는 다른 사람이 컴파일한 것입니다.dmckee의 훌륭한 답변을 참조하십시오.

커널은 자체적으로 컴파일되지 않습니다.사용자 공간의 C 컴파일러에 의해 컴파일됩니다.대부분의 CPU 아키텍처에서 CPU는 현재 실행 중인 코드가 가진 권한을 나타내는 다수의 비트를 특수 레지스터에 가지고 있습니다.x86 에서는, 이것들은 코드 세그먼트(CS) 레지스터내의 현재의 특권 레벨 비트(CPL)입니다.CPL 비트가 00일 경우 코드는 커널 모드라고도 불리는 보안 링0에서 실행되고 있다고 합니다.CPL 비트가 11인 경우 코드는 사용자 모드라고도 불리는 보안 링3에서 실행되고 있는 것으로 간주됩니다.다른 2개의 조합인 01과 10(각각 보안 링1과 2)은 거의 사용되지 않습니다.

사용자 모드와 커널 모드에서 코드가 할 수 있는 것과 할 수 없는 것에 대한 규칙은 다소 복잡하지만, 사용자 모드에서는 권한이 심각하게 감소했습니다.

운영 체제의 커널에 대해 말할 때, OS 코드 중 높은 권한으로 커널 모드로 실행되는 부분을 가리킵니다.일반적으로 커널 작성자는 보안상의 이유로 커널을 가능한 한 작게 유지하려고 합니다.따라서 추가 권한이 필요 없는 코드에는 커널이 없습니다.

C 컴파일러는 이러한 프로그램의 한 예입니다.커널 모드에서 제공되는 추가 권한이 필요하지 않기 때문에 대부분의 다른 프로그램과 마찬가지로 사용자 모드로 실행됩니다.

리눅스의 경우 커널은 커널의 소스 코드와 커널의 컴파일된 실행 파일의 두 부분으로 구성됩니다.C 컴파일러를 탑재한 머신은 소스 코드에서 바이너리 이미지로 커널을 컴파일할 수 있습니다.그렇다면 문제는 이 2진법으로 무엇을 할 것인가 하는 것입니다.

새로운 시스템에 Linux 를 인스톨 하는 경우는, 통상, 물리 미디어(CD DVD 등) 또는 네트워크로부터 사전에 컴파일 된 바이너리 이미지를 인스톨 합니다.BIOS는 미디어 또는 네트워크에서 커널의 부트로더(바이너리 이미지)를 로드하고 부트로더는 하드디스크에 커널(바이너리 이미지)을 설치합니다.그 후 재부팅하면 BIOS는 커널의 부트로더를 하드디스크에서 로드하고 부트로더는 커널을 메모리에 로드하여 전원이 꺼진 상태로 가동합니다.

자신의 커널을 재컴파일 하는 것은 조금 까다롭지만 할 수 있습니다.

제가 당신의 질문을 제대로 이해하고 있다면요.요즘은 커널이 컴파일되지 않습니다.오늘날 대부분의 Linux 디스트리뷰션에서는 Linux 라이브 CD를 사용하여 시스템을 설치합니다.커널은 CD에서 메모리로 로드되어 디스크에 설치되어 있는 것처럼 정상적으로 동작합니다.시스템에서 Linux 환경이 가동되고 있으면 필요한 파일을 디스크에 커밋하는 것만으로 충분합니다.

부트스트래핑의 문제에 대해서라면, dmckee는 꽤 잘 정리했습니다.

다른 가능성을 제시하는 것 뿐인데...

이 현상을 설명하는 용어는 부트스트랩(bootstraping)으로, 읽어보면 흥미로운 개념입니다.임베디드 개발에 대해 생각해 보면 자명종, 전자레인지, 리모트 컨트롤 등 소프트웨어를 필요로 하는 많은 디바이스는 자체 소프트웨어를 컴파일할 수 있을 만큼 강력하지 않다는 것을 알 수 있습니다.실제로 이러한 종류의 디바이스는 컴파일러처럼 복잡한 것을 원격으로 실행할 수 있는 충분한 자원을 가지고 있지 않습니다.

소프트웨어는 데스크톱 머신에서 개발되어 컴파일되면 복사됩니다.

이런 것에 흥미가 있다면, 머릿속에서 떠오르는 기사는 「신뢰에 대한 성찰」(pdf)입니다.이것은 고전적이고 재미있는 읽을거리입니다.

거북이가 내려간 게 아니야말씀하신 것처럼 컴파일되지 않은 운영체제는 해당 운영체제를 실행하는 시스템에서 컴파일할 수 없습니다.마찬가지로 적어도 컴파일러의 첫 번째 빌드는 다른 컴파일러에서 실행되어야 합니다(그리고 보통 그 첫 번째 빌드가 아직 자체 소스 코드를 컴파일할 수 없는 것으로 판명된 경우 후속 빌드도 마찬가지입니다).

첫 번째 Linux 커널은 Minix 박스에 컴파일된 것 같습니다만, 그 점은 잘 모르겠습니다.당시 GCC는 이용 가능했다.많은 운영 체제의 초기 목표 중 하나는 자체 소스 코드를 컴파일할 수 있을 만큼 컴파일러를 잘 실행하는 것입니다.더 나아가 첫 번째 컴파일러는 거의 확실히 어셈블리 언어로 작성되었습니다.최초의 조립자는 가공되지 않은 기계 코드로 작성해야 하는 가난한 사람들에 의해 작성되었습니다.

리눅스 From Scratch 프로젝트를 체크 아웃할 수 있습니다.이 책에서는 실제로 2개의 시스템을 구축합니다.직접 구축하지 않은 시스템에 구축되는 '임시 시스템'과 임시 시스템에 구축되는 'LFS 시스템'입니다.현재 이 책의 작성 방법으로는 다른 Linux 박스에 임시 시스템을 구축하지만 이론적으로는 완전히 다른 OS에 임시 시스템을 구축하도록 조정할 수 있습니다.

어떤 게 먼저였나요?닭이냐 달걀이냐?

알은 공룡 시대부터 존재해 왔다.

..닭은 사실 위대한 짐승의 후손이라고 해서 모든 것을 혼란스럽게 한다.간단히 말하면:테크놀로지(계란)는 현재 제품(치킨)보다 먼저 존재했습니다.

커널을 빌드하려면 커널이 필요합니다. 즉, 커널을 다른 커널로 빌드합니다.

첫 번째 커널은 원하는 모든 것을 사용할 수 있습니다(가능하다면 원하는 최종 제품을 만들있는 합리적인 것이 좋습니다^_^).

Bran's Kernel Development에서 제공하는 이 튜토리얼에서는 선택한 가상 머신에서 테스트할 수 있는 작은 커널을 개발하고 구축하는 방법을 설명합니다.

즉, 커널을 쓰고 컴파일하여 빈(OS 없음) 가상 머신에서 읽습니다.

이러한 Linux 의 인스톨에서는, 같은 생각에 따라 복잡성이 증가합니다.

ReferenceURL : https://stackoverflow.com/questions/494372/how-can-the-linux-kernel-compile-itself

반응형