web-dev-qa-db-ja.com

Linuxカーネルはどのようにしてそれ自体をコンパイルできますか?

自分のマシンにLinuxシステムをインストールしたときのLinuxカーネルのコンパイルプロセスがよくわかりません。

ここに私を混乱させたいくつかのものがあります:

  1. カーネルはCで書かれていますが、コンパイラをインストールせずにカーネルをコンパイルするにはどうすればよいですか?
  2. カーネルをコンパイルする前にCコンパイラをマシンにインストールした場合、コンパイラをインストールせずにコンパイラ自体をコンパイルするにはどうすればよいですか?

返事をありがとう、私は数日間とても混乱していました。

88
MainID

Linuxボックスの最初のバイナリは、おそらく他のLinuxボックス上に構築されました。

最初のLinuxシステムのバイナリは、いくつかのotherプラットフォームで構築されました。

そのコンピュータのバイナリは、ルートを追跡して、まだ別のプラットフォームで構築された元のシステムに戻ることができます。

...

これを十分に押し出すと、より原始的なツールでビルドされたコンパイラーが見つかり、それらはホスト以外のマシンでビルドされました。

...

押し続けると、マシンのフロントパネルにあるスイッチの設定で指示を入力できるように構築されたコンピューターが見つかります。

とてもクールなもの。

ルールは、「ツールをビルドして、ツールをビルドする...」です。物理環境を実行するツールと非常によく似ています。 「ブートストラップによって自分を引き上げる」とも呼ばれます。

以下を区別する必要があると思います。

compile、v:コンパイラを使用してソースコードを処理し、実行可能コードを生成するには [1]

そして

install、v:接続、セットアップ、または使用するための準備 [2]

コンパイルは、ソースコードからバイナリ実行可能ファイルを生成します。インストールは、それらのバイナリ実行可能ファイルを後で実行するための適切な場所に配置するだけです。したがって、バイナリが利用可能であれば、インストールと使用にコンパイルは必要ありません。 「cook」や「serve」のように、「コンパイル」や「インストール」も同様に考えてください。

さて、あなたの質問:

  1. カーネルはCで書かれていますが、コンパイラをインストールせずにカーネルをコンパイルするにはどうすればよいですか?

カーネルはコンパイラなしではコンパイルできませんが、コンパイルされたバイナリからinstalledにすることはできます。

通常、オペレーティングシステムをインストールするときに、事前にコンパイルされたカーネル(バイナリ実行可能ファイル)をインストールします。他の誰かによって編集されました。カーネルを自分でコンパイルする場合にのみ、ソースとコンパイラ、およびその他すべてのツールが必要です。

Gentooのような「ソースベース」のディストリビューションでも、コンパイルされたバイナリの実行から始めます。

したがって、カーネルをコンパイルすることなく、他の誰かによってコンパイルされているため、生涯を過ごすことができます。

  1. カーネルをコンパイルする前にCコンパイラをマシンにインストールした場合、コンパイラをインストールせずにコンパイラ自体をコンパイルするにはどうすればよいですか?

カーネル(OS)がない場合、コンパイラーは実行できません。したがって、コンパイラを実行するにはcompiledカーネルをインストールする必要がありますが、-compile toカーネル自体は必要ありません。

繰り返しますが、最も一般的な方法は、コンパイラのコンパイル済みバイナリをインストールし、それらを使用して他のもの(コンパイラ自体とカーネルを含む)をコンパイルすることです。

さて、鶏と卵の問題。最初のバイナリは他の誰かによってコンパイルされています... dmckeeによるすばらしい答えを見てください。

33
sastanin

この現象を説明する用語は bootstrapping です。これは、読み進めるのに興味深い概念です。組み込み開発について考えると、ソフトウェアを必要とする多くのデバイス(目覚まし時計、電子レンジ、リモコンなど)は、独自のソフトウェアをコンパイルするのに十分強力ではないことが明らかになります。実際、これらの種類のデバイスには、通常、コンパイラのように複雑なものをリモートで実行するための十分なリソースがありません。

彼らのソフトウェアはデスクトップマシンで開発され、コンパイルされたらコピーされます。

この種のことに興味があるなら、頭の中で頭に浮かぶ記事は次のとおりです。 信頼の信頼pdf )、それは古典的で楽しいです読んだ。

14
a2800276

カーネルはそれ自体をコンパイルしません-ユーザー空間でCコンパイラによってコンパイルされます。ほとんどのCPUアーキテクチャでは、CPUは、現在実行中のコードがどのような特権を持っているかを表す特別なレジスタにビット数を持っています。 x86では、これらはコードセグメント(CS)レジスタの現在の特権レベルビット(CPL)です。 CPLビットが00の場合、コードはセキュリティリングカーネルモードとも呼ばれます)で実行されていると言います。 CPLビットが11の場合、コードはセキュリティリングユーザーモードとも呼ばれます)で実行されていると言います。他の2つの組み合わせ01と10(それぞれセキュリティリング1と2)はほとんど使用されません。

ユーザーモードとカーネルモードでコードで実行できることと実行できないことに関するルールはかなり複雑ですが、ユーザーモードでは特権が大幅に削減されていると言えます。

さて、人々がオペレーティングシステムのカーネルについて話すとき、彼らは、昇格された特権でカーネルモードで実行されるOSのコードの部分を指しています。一般に、カーネルの作成者は、セキュリティ上の理由からカーネルをできるだけ小さくしようとします。そのため、追加の特権を必要としないコードにはカーネルがありません。

Cコンパイラはそのようなプログラムの一例です。カーネルモードで提供される特別な権限は必要ないため、他のほとんどのプログラムと同様に、ユーザーモードで実行されます。

Linuxの場合、カーネルは2つの部分で構成されています。カーネルのソースコードと、カーネルのコンパイルされた実行可能ファイルです。 Cコンパイラを備えたどのマシンでも、カーネルをソースコードからバイナリイメージにコンパイルできます。問題は、そのバイナリイメージをどうするかです。

Linuxを新しいシステムにインストールすると、通常は物理メディア(CD DVDなど)またはネットワークから、プリコンパイルされたバイナリイメージがインストールされます。 BIOSがメディアまたはネットワークからカーネルのブートローダー(のバイナリイメージ)をロードし、ブートローダーがカーネル(のバイナリイメージ)をハードディスクにインストールします。次に、リブートすると、BIOSがハードディスクからカーネルのブートローダーをロードし、ブートローダーがカーネルをメモリにロードします。

recompile独自のカーネルにしたい場合は、少しトリッキーですが、実行できます。

12
Adam Rosenfield

カメがずっと下にいるわけではありません。あなたが言うように、そのオペレーティングシステムを実行しているシステム上で、これまでコンパイルされたことがないオペレーティングシステムをコンパイルすることはできません。同様に、少なくともコンパイラーの最初のビルドは別のコンパイラーで実行する必要があります(最初のビルドでまだ独自のソースコードをコンパイルできないことが判明した場合は、通常、後続のビルドもいくつか行います)。

最初のLinuxカーネルはMinixボックスでコンパイルされたと思いますが、それについてはよくわかりません。当時GCCが利用可能でした。多くのオペレーティングシステムの非常に初期の目標の1つは、独自のソースコードをコンパイルするのに十分なほどコンパイラを実行することです。さらに進んで、最初のコンパイラはほぼ間違いなくアセンブリ言語で書かれていました。最初のアセンブラは、生のマシンコードで書かなければならなかった貧しい人々によって書かれました。

Linux From Scratch プロジェクトを確認してください。本で実際に2つのシステムを構築します。自分で構築していないシステム上に構築された「一時システム」と、一時システム上に構築された「LFSシステム」です。本が現在書かれている方法では、実際には別のLinuxボックスで一時システムを構築しますが、理論的には完全に異なるOSで一時システムを構築するためにそれを適応させることができます。

5
The Spooniest

どちらが最初にありましたか?ニワトリか卵?

卵は恐竜の時代から存在しています。

..鶏は実際には偉大な獣の子孫であると言ってすべてを混乱させる人もいます。

カーネルを構築するにはカーネルが必要です。つまり、一方を他方で構築します。

最初のカーネルはあなたが好きなものにすることができます(できれば、望ましい最終製品を作成できる賢明なもの^ __ ^)

Branのカーネル開発からのこのチュートリアル は、小さめのカーネルを開発して構築する方法を教えており、選択した仮想マシンでテストできます。

意味:カーネルをどこかで作成およびコンパイルし、空の(OSなし)仮想マシンでそれを読み取ります。

これらのLinuxインストールで何が起こるかは、同じ考えに従い、さらに複雑になります。

5
Ric Tokyo

私があなたの質問を正しく理解しているなら。カーネルは最近「自分自身をコンパイル」していません。今日のほとんどのLinuxディストリビューションは、LinuxライブCDを介したシステムインストールを提供しています。カーネルはCDからメモリに読み込まれ、ディスクにインストールされた場合と同じように動作します。 Linux環境がシステムで稼働している場合、必要なファイルをディスクにコミットするだけで簡単です。

ブートストラップの問題について話していた場合、 dmckeeはそれをかなりいい形でまとめました。

別の可能性を提供するだけ...

1
in70x