제가 이해한 바에 따르면 Ubuntu와 같은 배포판은 Linux 커널 위에 구축되어 있으며 Linux 커널 자체는 플랫폼 하드웨어에 대한 인터페이스일 뿐입니다. 예를 들어 Linux 소스 코드에서는 플랫폼이 특정 기능(예: )을 구현해야 합니다 raw_copy_from_user
. 플랫폼이 이 인터페이스를 따르면 이를 컴파일할 수 있습니다. 이제 릴리스를 이 컴파일된 바이너리를 빌드 입력으로 요구하는 추가 코드로 생각하는 것이 맞습니까? 이 경우 컴파일된 바이너리를 입력으로 사용할 수 있습니까?
예를 들어, 새로운 플랫폼을 개발하고 arch/
컴파일을 위해 필요한 모든 코드를 커널에 넣었다고 가정해 보겠습니다. 그렇다면 이 바이너리와 기존 배포판을 사용하여 내 플랫폼에서 작동하는 운영 체제를 구축하려면 어떻게 해야 할까요?
답변1
배포판에 새로운 플랫폼을 제공하려면 여러 단계가 필요하며 그 중 첫 번째 단계는 커널이 아닙니다.
플랫폼용 프로그램을 구축할 수 있어야 합니다. 이는 컴파일러(및 어셈블러)가 필요함을 의미합니다. GCC를 사용하는 시스템의 경우 플랫폼에 사용할 수 있는 Binutils 및 GCC가 있어야 함을 의미합니다.
컴파일러가 있으면 C 라이브러리가 필요합니다. 그래야만 일반 C 프로그램을 작성하는 데 필요한 모든 것을 갖게 됩니다.
이를 통해 새 플랫폼에 대한 프로그램 크로스 컴파일을 시작할 수 있습니다. 이는 일반적으로 플랫폼 초기화가 수행되는 방식입니다. 처음에는 새 플랫폼에 작업 환경이 없으므로 다른 시스템에 빌드해야 합니다.
C 컴파일러가 있으면 C 라이브러리 이전에도 커널 작업을 시작할 수 있습니다. 대부분의 커널은 플랫폼 독립적이지만 새
arch
하위 디렉터리를 추가하고 새 플랫폼에 필요한 모든 것을 구현해야 합니다(시스템 초기화, 메모리 관리, 시스템 호출 인터페이스 등). Linux 커널의 빌드 인프라는 크로스 컴파일에 대한 강력한 지원을 제공하며 이는 아키텍처가 시작된 후에도 도움이 됩니다. 특히 임베디드 시스템은 더 빠른 시스템에서 커널을 빌드할 수 있다는 이점을 얻습니다.플랫폼 시작의 마지막 부분은 부팅입니다. 일종의 부트로더가 필요하며 세부 사항은 플랫폼마다 다를 수 있습니다.
이 시점에서 최소한 새 플랫폼에서 빌드 환경을 실행할 수 있을 만큼 배포판의 핵심을 빌드할 수 있어야 하며, 이를 통해 새 플랫폼에서 기본적으로 프로그램 빌드를 시작할 수 있습니다. (크로스 컴파일이 모든 경우에 작동하는 것은 아닙니다.)
배포 환경에서는 빌드 환경이 새 플랫폼에서 실행될 준비가 되면 일반적으로 배포에서 사용하는 공통 빌드 인프라에 이를 제공하고 배포 패키지 빌드를 시작합니다. 당신은 할 수 있습니다데비안 포트그리고통계 구축— 패키지 가용성 차트를 구체적으로 살펴보십시오.
수직선은 새 아키텍처가 제안되는 시기를 나타냅니다. 새 아키텍처를 위해 "쉽게" 구축된 모든 패키지는 빠르게 승격된 다음 점진적으로 진행률을 100%로 늘립니다. (일부 패키지는 아키텍처에 따라 다르므로 아키텍처는 100%가 될 수 없습니다.)
비공식 아키텍처의 다이어그램도 흥미롭습니다.
이와 같은 새로운 아키텍처는 riscv64
쉽게 식별할 수 있습니다 hppa
.