私が理解しているように、UbuntuのようなディストリビューションはLinuxカーネルの上に構築されており、Linuxカーネル自体はプラットフォームハードウェアへのインターフェースです。たとえば、Linuxソースコードでは、プラットフォームは特定の機能(たとえば)を実装する必要がありますraw_copy_from_user
。プラットフォームがこのインターフェースに従うと、それをコンパイルできます。これで、リリースをこのコンパイルされたバイナリをビルド入力として要求する追加のコードと考えることは正しいですか?この場合、コンパイルされたバイナリを入力として使用できますか?
たとえば、新しいプラットフォームを開発し、arch/
コンパイルに必要なすべてのコードをカーネルに入れたとします。それでは、このバイナリと既存のディストリビューションを使用してプラットフォーム上で動作するオペレーティングシステムを構築するにはどうすればよいですか?
答え1
ディストリビューションに新しいプラットフォームを提供するにはいくつかのステップが必要で、その最初のステップはカーネルではありません。
プラットフォーム用のプログラムを構築できる必要があります。これはコンパイラ(およびアセンブラ)が必要であることを意味します。 GCCを使用するシステムでは、プラットフォームに使用できるBinutilsとGCCが必要です。
コンパイラがある場合は、Cライブラリが必要です。そうしてこそ、通常のCプログラムを書くのに必要なすべてを持っています。
これにより、新しいプラットフォームのプログラムクロスコンパイルを開始できます。これは通常、プラットフォームの初期化が実行される方法です。最初は新しいプラットフォームに作業環境がないため、別のシステムにビルドする必要があります。
C コンパイラがある場合は、C ライブラリの前にカーネル操作を開始できます。ほとんどのカーネルはプラットフォームに依存しませんが、新しい
arch
サブディレクトリを追加し、新しいプラットフォームに必要なすべてを実装する必要があります(システム初期化、メモリ管理、システムコールインターフェイスなど)。 Linuxカーネルのビルドインフラストラクチャは、クロスコンパイルの強力なサポートを提供します。これは、アーキテクチャの起動後も役立ちます。特に、組み込みシステムは、より高速なシステムでカーネルを構築できるという利点を得ます。プラットフォームの起動の最後の部分はブートです。ある種のブートローダが必要で、詳細はプラットフォームによって異なる場合があります。
この時点で、少なくとも新しいプラットフォームでビルド環境を実行できるように、ディストリビューションのコアを構築できる必要があります。これにより、新しいプラットフォームでデフォルトでプログラムのビルドを開始できます。 (クロスコンパイルがすべての場合で動作するわけではありません。)
デプロイメント環境では、ビルド環境が新しいプラットフォームで実行される準備ができたら、通常デプロイメントで使用される共通ビルドインフラストラクチャにそれを提供し、デプロイメントパッケージのビルドを開始します。することができますDebian ポートそして統計の構築- パッケージの可用性チャートを具体的に見てください。
縦線は、新しいアーキテクチャが提案される時期を示します。新しいアーキテクチャのために「簡単に」構築されたすべてのパッケージは急速に昇格し、徐々に進行を100%に増やします。 (一部のパッケージはアーキテクチャによって異なるため、アーキテクチャは100%にすることはできません。)
非公式アーキテクチャの図も興味深いです。
このような新しいアーキテクチャはriscv64
簡単に識別できますhppa
。