IT story

Linux 커널은 어떻게 자체적으로 컴파일 할 수 있습니까?

hot-time 2020. 9. 10. 18:57
반응형

Linux 커널은 어떻게 자체적으로 컴파일 할 수 있습니까?


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

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

  1. 커널은 C로 작성되었지만 컴파일러를 설치하지 않고 어떻게 커널을 컴파일 했습니까?
  2. 커널이 컴파일되기 전에 내 컴퓨터에 C 컴파일러가 설치되어있는 경우 컴파일러를 설치하지 않고 어떻게 컴파일러 자체를 컴파일 할 수 있습니까?

나는 며칠 동안 너무 혼란 스러웠습니다. 답변에 감사드립니다.


리눅스 박스의 첫 번째 바이너리는 (아마도) 다른 리눅스 박스에서 빌드되었습니다.

첫 번째 Linux 시스템의 바이너리는 다른 플랫폼 에서 빌드되었습니다 .

해당 컴퓨터의 바이너리는 또 다른 플랫폼 에 구축 된 원래 시스템까지 루트를 추적 할 수 있습니다.

...

이 정도까지 밀어 붙이면 더 원시적 인 도구로 빌드 된 컴파일러를 찾을 수 있습니다.이 도구는 호스트가 아닌 다른 머신에서 빌드되었습니다.

...

계속 밀면 기계 전면 패널의 스위치를 설정 하여 지침을 입력 할 수 있도록 제작 된 컴퓨터를 찾을 수 있습니다 .

아주 멋진 것들.

규칙은 "도구를 빌드하기위한 도구를 빌드하는 도구를 빌드하십시오 ..."입니다. 물리적 환경을 실행하는 도구와 매우 유사합니다. "부트 스트랩으로 자신을 끌어 당기기"라고도합니다.


다음을 구분해야한다고 생각합니다.

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

install , v : 연결, 설정 또는 사용할 것을 준비하려면 [2] .

컴파일은 소스 코드에서 바이너리 실행 파일을 생성합니다. 설치는 이진 실행 파일을 나중에 실행할 수있는 올바른 위치에 놓기 만합니다. 따라서 바이너리를 사용할 수있는 경우 설치 및 사용에 컴파일이 필요하지 않습니다. "cook"및 "serve"와 같이 "컴파일"및 "설치"를 적절하게 생각하십시오.

이제 질문 :

  1. 커널은 C로 작성되었지만 컴파일러를 설치하지 않고 어떻게 커널을 컴파일 했습니까?

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

일반적으로 운영 체제를 설치할 때 미리 컴파일 된 커널 (이진 실행 파일)을 설치합니다. 다른 사람이 편집했습니다. 커널을 직접 컴파일하려는 경우에만 소스와 컴파일러 및 기타 모든 도구가 필요합니다.

젠투와 같은 "소스 기반"배포판에서도 컴파일 된 바이너리를 실행하기 시작합니다.

따라서 다른 사람이 커널을 컴파일했기 때문에 커널을 컴파일하지 않고도 평생을 살 수 있습니다.

  1. 커널이 컴파일되기 전에 내 컴퓨터에 C 컴파일러가 설치되어있는 경우 컴파일러를 설치하지 않고 어떻게 컴파일러 자체를 컴파일 할 수 있습니까?

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

다시 말하지만, 가장 일반적인 방법은 컴파일러의 컴파일 된 바이너리를 설치하고이를 사용하여 다른 모든 것을 컴파일하는 것입니다 (컴파일러 자체 및 커널 포함).

자, 닭고기와 계란 문제. 첫 번째 바이너리는 다른 사람에 의해 컴파일됩니다. dmckee의 훌륭한 답변을 참조하십시오.


이 현상을 설명하는 용어는 부트 스트래핑 입니다. 읽어보기에 흥미로운 개념입니다. 임베디드 개발에 대해 생각해 보면 소프트웨어를 필요로하는 알람 시계, 전자 레인지, 원격 제어와 같은 많은 장치가 자체 소프트웨어를 컴파일 할만큼 강력하지 않다는 것이 분명해집니다. 실제로 이러한 종류의 장치에는 일반적으로 컴파일러만큼 복잡한 것을 원격으로 실행할 수있는 리소스가 충분하지 않습니다.

그들의 소프트웨어는 데스크톱 컴퓨터에서 개발 된 다음 컴파일이 완료되면 복사됩니다.

이런 종류의 것이 흥미 롭다면 내 머릿속에서 떠오르는 기사는 Trusting Trust에 대한 성찰 ( pdf )입니다.이 글은 고전적이고 재미있는 읽기입니다.


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

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

이제 사람들이 운영 체제의 커널에 대해 이야기 할 때, 그들은 상승 된 권한으로 커널 모드에서 실행되는 OS 코드의 일부를 의미합니다. 일반적으로 커널 작성자는 보안상의 이유로 커널을 가능한 한 작게 유지하려고하므로 추가 권한이 필요하지 않은 코드에는 커널이 없습니다.

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

Linux의 경우 커널은 커널의 소스 코드와 커널의 컴파일 된 실행 파일의 두 부분으로 구성됩니다. C 컴파일러가있는 모든 컴퓨터는 소스 코드의 커널을 이진 이미지로 컴파일 할 수 있습니다. 그렇다면 이진 이미지로 무엇을해야하는지에 대한 질문이 있습니다.

새 시스템에 Linux를 설치할 때 일반적으로 물리적 미디어 (예 : CD DVD) 또는 네트워크에서 미리 컴파일 된 바이너리 이미지를 설치합니다. BIOS는 미디어 또는 네트워크에서 커널의 부트 로더 (의 바이너리 이미지)를로드 한 다음 부트 로더는 하드 디스크에 커널 (의 바이너리 이미지)을 설치합니다. 그런 다음 재부팅 할 때 BIOS가 하드 디스크에서 커널의 부트 로더를로드하고 부트 로더가 커널을 메모리로로드하면 작동이 중지됩니다.

자신의 커널 다시 컴파일 하려면 약간 까다 롭지 만 수행 할 수 있습니다.


어느 것이 먼저 있었습니까? 닭고기 또는 계란?

공룡 시대부터 알이 ..

.. 어떤 사람들은 닭이 실제로 큰 짐승의 후손이라고 말하면서 모든 것을 혼동합니다. 짧은 이야기 : 기술 (달걀)은 현재 제품 (닭) 이전에 존재했습니다.

커널을 빌드하려면 커널이 필요합니다. 즉, 다른 하나와 함께 빌드합니다.

첫 번째 커널은 원하는 모든 것이 될 수 있습니다 (원하는 최종 제품을 만들 수있는 합리적인 것 ^ __ ^).

Bran의 Kernel Development의이 튜토리얼 에서는 선택한 가상 머신으로 테스트 할 수있는 작은 커널을 개발하고 빌드하는 방법을 알려줍니다.

Meaning: you write and compile a kernel someplace, and read it on an empty (no OS) virtual machine.

What happens with those Linux installs follows the same idea with added complexity.


It's not turtles all the way down. Just like you say, you can't compile an operating system that has never been compiled before on a system that's running that operating system. Similarly, at least the very first build of a compiler must be done on another compiler (and usually some subsequent builds too, if that first build turns out not to be able to compile its own source code just yet).

I think the very first Linux kernels were compiled on a Minix box, though I'm not certain about that. GCC was available at the time. One of the very early goals of many operating systems is to run a compiler well enough to compile their own source code. Going further, the first compiler was almost certainly written in assembly language. The first assemblers were written by those poor folks who had to write in raw machine code.

You may want to check out the Linux From Scratch project. You actually build two systems in the book: a "temporary system" that is built on a system you didn't build yourself, and then the "LFS system" that is built on your temporary system. The way the book is currently written, you actually build the temporary system on another Linux box, but in theory you could adapt it to build the temporary system on a completely different OS.


If I am understanding your question correctly. The kernel isn't "compiling itself" these days. Most Linux distributions today provide system installation through a linux live cd. The kernel is loaded from the CD into memory and operates as it would normally as if it were installed to disk. With a linux environment up and running on your system it is easy to just commit the necessary files to your disk.

If you were talking about the bootstrapping issue; dmckee summed it up pretty nice.

Just offering another possibility...

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

반응형