1. Linuxディストリビューション(例:Debian)

1. Linuxディストリビューション(例:Debian)

私は Linux カーネルを kernel.org からダウンロードしてコンパイルし、デスクトップに置いて、ターミナルを開きました。linux-3.2.13 フォルダーに変更し、 と入力しましたmr proper
次に、make menuconfig.config ファイルを設定します。設定が終わったら保存し、 と入力するmakeと、ターミナルがファイルのコンパイルを開始します。3 時間コンパイルした後、何か間違ったことをしたのではないかと考えていました。

私の質問は次のとおりです:

  1. 何か間違ったことをしましたか?
  2. そうでない場合、次に何をすべきでしょうか?
  3. 出力は何になりますか (例: .bin、.elf)?
  4. 私の最終的な目標は、コンパクトディスクに入れて別のコンピュータにインストールして実行できるOSを作成することです(ない異なるカーネルを持つ Ubuntu OS です。

答え1

何か間違ったことをしましたか?

そうは思えません。最近のカーネルをコンパイルするのは非常にリソースを消費します。CPUが最新でなく、RAMがあまりない場合は、とても長いです。
本当に必要なモジュール/機能だけを選択するようにしてください。また、少しのRAMを搭載したマルチコア/スレッドマシンをお持ちの場合は、ビルドを並列実行できる-jXオプションを使用してくださいmake。例:

make -j4

ビルドの大部分で 4 つのコアを使用します。

出力はどうなりますか?

これは圧縮されたカーネル イメージです。ELF ファイルではなく、通常の意味での実行ファイルでもありません。プラットフォームのブートローダが処理するのに適した形式です。

次は何をすればいいでしょうか?

何をするかによります...(ここGrub を使用している場合、モジュールとカーネル イメージをインストールするための簡単な HOWTO を参照してください。検索すれば他にもたくさん見つかります。また、新しいカーネルでメインストリーム ディストリビューションを実際に実行する予定の場合は、現在のディストリビューションのドキュメントを参照する方がよいでしょう。機能要件があり、initrd の特殊性も考慮する必要があります。

【私の目標は独自のOSを構築することです】

残念ながら、それは遠い話です。OS の構築は非常に複雑な作業です。カーネルを構築するのは非常に簡単な作業の 1 つです。

ぜひこちらへお越しくださいLinux をゼロから学ぶ最新の安定した「本」を読んでください。また、ディストリビューションウォッチ、ディストリビューションの「ソースベース」カテゴリを検索すると、興味深いものが見つかるかもしれません。

答え2

私は長いコメントを投稿していましたが、ボックスが大きいので好きなだけごまかすことができるので、回答として投稿するのが最善かもしれないと思いました。 :) 私の狂ったような発言を許してください。

また、今から警告しておきますが、私は完全なろくでなしなので、あなたの翼を少し切り落とすつもりです。

最初に決めなければならないのは、自分のプログラミング スキルがどの程度優れているかということです。優れたプログラミング スキルとハードウェアに関する十分な理解がなければ、独自の OS を作成することはできません。

次に決める必要があるのは次の点です。

  1. Linux ディストリビューションを作成していますか? (例: Debian、Ubuntu、Red Hat)
  2. 異なるランタイムを持つ Linux ベースのオペレーティング システムを作成していますか? (例: Android、Maemo)
  3. オペレーティング システムをゼロから作成していますか? (例: VMS、CP/M、RT-11、Amoeba、Plan/9)

これらの質問に答える前に、自分が何を作っているのかがわかるように、条件をきちんと理解しているかを再度確認する必要があります。

1. Linuxディストリビューション(例:Debian)

もしあなたが作りたいのがただもう一つの Linux ディストリビューションだけなら、カーネルのコンパイルは心配するほどのことではありません。十分な時間と十分な大きさのコンピュータがあれば、カーネルは事実上自動的にコンパイルされます。

こちらはLinuxディストリビューションを作成するいくつかの側面について議論した記事

これが想像以上に難しい理由は、ディストリビューションに追加したい機能が増えるほど、ディストリビューションを適切にビルドするのが難しくなるからです。車輪の再発明 (独自のパッケージ マネージャーを作成する) を行うか、既存の車輪 (RPM? APT? Ports?) を使用するかを選択する必要があります。どちらの場合でも、相互に互換性のないパッケージを調整し、コンパイルし、異なる CPU (Intel や AMD だけでなく) を搭載した異なるコンピューターを使用して動作を確認するなど、面倒な作業を何ヶ月も行うことになります。

範囲によっては、何千人もの人の作業を自分でやり直さなければならないこともあります。そこから多くのことを学べるでしょうか? もちろんです! しかし、既存の Linux ディストリビューションを実行し、時々自分でパッケージをコンパイルして動作を確認することによっても多くのことを学べます。X サーバーの構築方法を確認したいだけなら、なぜ libc や何百もの他のライブラリを構築しなければならないのでしょうか?

こう考えてみてください。PC の組み立て方を学びたい場合、トランジスタの入ったバケツとはんだごてから始めますか、それとも PC の部品とドキュメントを入手しますか?

2. LinuxベースのOS(例:Android)

POSIX とはかなり異なるランタイムを持つ Linux ベースのオペレーティング システムは数多くあります。Maemo、Meego、Android、その他の (ほとんどの場合は組み込み) オペレーティング システムなどが思い浮かびます。

これの利点は、独自のカーネルを書く必要がないことです。これの欠点は、独自のディストリビューションを設計する必要があるだけでなく、ほとんどのパッケージも自分で作成する必要があることです。コンパイルが面倒だgccと思ったlibcことはありませんか? 独自の ANSI-C 互換 C コンパイラを書いてみてください。そして完全なソフトウェア スタックを一から構築します。何年もかけて、ほんのわずかな満足感しか得られない、面倒な小さな関数 (おそらくアセンブリ言語) を記述します。また、Linux カーネルの内部構造のほとんどと、それがユーザー空間とどのように対話するかも学習する必要があります。そのインターフェイスが、構築の基盤となるからです。このチュートリアルが終わる頃には、ほとんどのシステム コール番号を暗記しているはずです。:)

たくさん学べますか? もちろんです! 想像していた以上にたくさん学べます。イライラしたり、イライラしたりしますか? もちろんです。Android が、暇な時間にラップトップで一人の男によって作られなかったのには理由があります。そもそも、gccそのように作られなかったのです。

3. ゼロから構築したオペレーティングシステム

ここで、アセンブラと C コンパイラを使って独自のカーネルを作成します — OS にカーネルがある場合に限ります。これは必ずしもそうではありません。ハードウェアのデータシートをすべてダウンロードして、作業を開始してください。基本的なカーネルを実行したら、ランタイムについて調べることができます。独自のランタイムを作成するか、カーネルが POSIX と部分的または完全に互換性があることを確認してから、完全な GNU ランタイムを自由に使用できます。ライブラリの最初のレイヤーを作成し、gcc新しい OS で実行する必要があります。

これはやりがいのあることでしょうか? 驚くほどやりがいがあります。難しいでしょうか? ドナルド・クヌースやアンドリュー・タネンバウムの名前があなたにとって何の意味も持たないのであれば、おそらく考え直したほうがよいでしょう。理論的なコンピュータサイエンスの勉強はたくさん必要になります。本当にゼロからオペレーティングシステムを作るには、信じられないほどの量の理論が必要です。残念ながら、現代のシステムには驚くほどの退屈さもあります。

昔は、JMP命令を適切な場所に書き込んだROMを書き込み、ソケットに差し込み、電源を入れるだけで完了でした。しかし、現代のシステムでは、CPUコアを起動して実行し、メモリを設定し、入力デバイスを列挙し、出力デバイスを起動するだけで、かなりの作業が必要になります。これらのタスクのそれぞれについて、1冊の本が出版されています(私は、オリジナルVGA は 1,000 ページを超えています。8 ビット マシンで育った私は、1987 年の VGA のプログラミングは簡単だと思っていました。本当にイライラしましたが、その過程で多くのことを学びました。

それで、あなたはそうすべきでしょうか?

絶対にそうすべきだ試す最初から目標が設定されていない限り、「成功」について誤解しないでください。OS/ディストリビューションのメンテナンスはオープンエンドこれは通常、大人数で行われる作業です。しかし、これを実行してみるだけでも、スキルが磨かれ、新しいスキルも身につきます。

ちなみに、私はこれらのことのほとんどに関して、(しばしば痛い)経験から話しています。私はいくつかの CPU 用の組み込み低レベル ランタイムを(共同で)作成しました(研究/仕事/楽しみのため)。また、現在はおもちゃの CPU 用のおもちゃの OS を作成中です(すべて楽しみのためです)。

答え3

Ubuntu でカーネルをコンパイルするには、次のチュートリアルの手順に従ってください。

カーネルをコンパイルする方法: Ubuntu の方法

関連情報