
kernel.orgからダウンロードしてデスクトップに配置し、ターミナルを開いてLinuxカーネルをコンパイルしました。 linux-3.2.13フォルダに変更してmr proper
。
次に、それを使用してmake menuconfig
.configファイルを設定します。完了して保存して入力make
し、端末でファイルのコンパイルを開始しました。 3時間コンパイルをしてから私が何か間違っているのではないかという気がします。
私の質問は次のとおりです
- 私は何が間違っていましたか?
- そうでない場合は、次に何をすべきですか?
- 出力は何ですか(例:.bin、.elf)?
- 私の究極の目標は、ディスクに入れて別のコンピュータに置いて実行できるオペレーティングシステムを作成することです。いいえ異なるカーネルを使用するUbuntuオペレーティングシステム)。
答え1
私は何が間違っていましたか?
のようには見えません。最新のカーネルをコンパイルするのはリソース集約的です。 CPU が最新の状態ではなく、RAM が多くない場合は、次の操作を行う必要があります。非常に長い。
実際に必要なモジュール/機能のみを選択し、一部のRAMを搭載したマルチコア/スレッドコンピュータがある場合は、この-jX
オプションを使用しmake
てビルドを並列に実行できます。例えば
make -j4
ほとんどのビルドは4つのコアを使用します。
出力はどうなりますか?
圧縮カーネルイメージになります。 ELFファイルでもなく、一般的な意味の実行ファイルでもありません。プラットフォームのブートローダで処理するのに適した形式です。
次は何をすべきですか?
実行する操作によって異なります...(参照ここGrubを使用すると仮定し、モジュールとカーネルイメージのインストールに関する簡単なHOWTOを参照してください。クイック検索で利用可能な他のものがたくさんあり、実際に新しいカーネルで主流のディストリビューションを実行する予定の場合は、現在のディストリビューションのドキュメントを確認する方が良いでしょう。いくつかの機能要件があり、以下があります。考慮すべき初期化特性があります。 )
[私の目標は、独自のオペレーティングシステムを作成することです。]
まだそうするには遠かったようです。オペレーティングシステムの構築は非常に複雑な作業であり、カーネルの構築は非常に単純な部分の1つです。
行くことをお勧めします最初からLinuxそして現在、安定した「本」をお読みください。また注意してくださいリリース時計をクリックして、「ソースベース」展開カテゴリを検索します。その中には興味があるかもしれません。
答え2
コメントをたくさん付けましたが、箱が大きくて横説説をすることができるので、内容を回答として投稿するのが良いと思いました。 :) 私の狂った横説説を許してください。
また、今警告します。私は完全に愚かで、あなたの翼を少しカットします。
最初に決定する必要があるのは、プログラミング技術がどれほど良いかです。良いプログラミング技術とハードウェアの良い理解がなければ、独自のオペレーティングシステムを書くことはできません。
2番目に決めるべきことは次のとおりです。
- Linuxディストリビューションを作成していますか? (例:Debian、Ubuntu、Red Hat)
- 別のランタイムを使用するLinuxベースのオペレーティングシステムを作成していますか? (例:Android、Maemo)
- オペレーティングシステムを最初から作成していますか? (例:VMS、CP/M、RT-11、Amoeba、Plan/9)
これらの質問に答える前に、あなたが何をしているのかを知るために用語を書き留めたことを再確認する必要があります。
1. Linuxディストリビューション(例:Debian)
他のLinuxディストリビューションを作成したい場合は、カーネルをコンパイルするのが最も心配です。十分な時間があり、コンピュータが十分に大きい場合、カーネルは実際に自分でコンパイルできます。
これはLinuxディストリビューションの作成のいくつかの側面を議論する記事。
これが思ったよりも難しい理由:ディストリビューションに追加する機能が多いほど、ディストリビューションを正しく構築するのは難しくなります。ホイールを再作成するか(独自のパッケージマネージャを作成するか)、既存のものを使用するか(RPM?APT?ポート?)を選択する必要があります。どちらの場合も、互換性のないパッケージを調整し、IntelやAMDだけでなく、他のCPUを使用する他のシステムでタスクをコンパイルして検証するなど、面倒な作業を実行するのに数ヶ月を費やします。
範囲によっては、何千人もの人々の作業を直接やり直す必要があるかもしれません。それから多くを学ぶことができますか?完全に!しかし、既存のLinuxディストリビューションを実行し、時々いくつかのパッケージを直接コンパイルして動作を確認することで、多くのことを学ぶことができます。 Xサーバーがどのように構築されているかを知りたい場合は、なぜlibcと他の何百ものライブラリを構築するのですか?
こう考えてみてください。 PCの作り方を学びたい場合は、トランジスタパススルーはんだごてから始めますか、またはPCコンポーネントといくつかの文書から始めますか?
2. Linuxベースのオペレーティングシステム(例:Android)
ランタイムがPOSIXとはかなり異なるLinuxベースのオペレーティングシステムがかなりあります。私はMaemo、Meego、Android、その他(最も一般的に組み込まれている)オペレーティングシステムを考えています。
これの利点は、独自のカーネルを作成する必要がないことです。これの欠点は、独自のディストリビューションを設計するだけでなく、ほとんどのパッケージも直接作成する必要があることです。編集が痛いgcc
と思いますかlibc
?独自のANSI-C互換Cコンパイラを作成してみてください。そして最初から完全なソフトウェアスタック。長年にわたり面倒な小さな機能(おそらくアセンブリ内)を書くことで、少し満足感を得ることができます。また、そのインターフェースに基づいて構築するので、Linuxカーネル内の多くの部分とこれがユーザー空間と通信する方法を学ぶ必要があります。この記事を完了すると、ほとんどのシステムコール番号を覚えています。 :)
たくさん学びますか?完全に!あなたが思う以上に。欲求不満と迷惑を感じますか?まさにこれです。孤独な男がレジャー時にノートパソコンでAndroidを開発していない理由はあります。そのようにgcc
建てられませんでした。
3. 最初からオペレーティングシステム
オペレーティングシステムにカーネルがある場合は、アセンブラとCコンパイラで始まり、独自のカーネルを作成します。これは普遍的に真実ではありません。見つけることができるハードウェアデータシートをダウンロードして始めてください。デフォルトのカーネルが実行されると、ランタイムが表示されます。独自のランタイムを作成するか、カーネルが部分的または完全にPOSIXと互換性があることを確認してから、完全なGNUランタイムを持つことになります。最初の階層ライブラリを「ただ」作成し、gcc
新しいオペレーティングシステムで実行するだけです。
これは効果がありますか?驚くべきことに。難しいですか? Donald KnuthやAndrew Tanenbaumなどの名前があなたに何の意味もない場合は、おそらくもう一度考えてみる必要があります。理論コンピュータ工学を勉強する方が多いでしょう。実際、オペレーティングシステムを最初から構築するには多くの理論が必要です。残念ながら、現代のシステムも多くの退屈を経験しています。
以前は、正しい場所にJMPガイドラインを含むROMを焼いて、接続し、電源を入れると作業が完了しました。最新のシステムでは、CPUコアを起動して実行し、メモリを設定し、入力デバイスを列挙し、出力デバイスをアクティブにするために多くの作業が必要です。これらの各タスクの完全な本があります。オリジナル1,000ページを超えるVGA - 8ビットコンピュータで成長し、1987 VGAプログラミングが簡単になると思い、非常に迷惑ですが、その過程で多くを学びました! )
では、そうすべきでしょうか?
君は必ずそうしなければならない努力する。最初から目標を立てないと「成功」を誤解しないでください。オペレーティングシステム/ディストリビューションのメンテナンスは開いている一般的に大規模な人々が行うことです。しかし、これを試すだけでも技術が磨かれ、新しい技術を学ぶことができます。
しかし、私はこれらのもののほとんどについて(しばしば痛みを伴う)経験に基づいて話します。私はいくつかのCPU(勉強/作業/遊び)のための組み込み低レベルランタイムを(共同)作成しました。
答え3
Ubuntuでカーネルをコンパイルするには、次のチュートリアルで提供されている手順に従ってください。