web-dev-qa-db-ja.com

Linuxのソースコードを変更してカスタムOSを作る方法は?

Linux(Ubuntuなど)は、ソースコードを変更することで自由にカスタマイズでき、まったく新しいOSを作成できると聞いています。 Linuxカーネルのソースコードをwww.kernel.orgウェブサイトからダウンロードしました。しかし、それを見ると何も理解できません。非常に多くのディレクトリ、ファイル内のファイルがあります(1つの大きなプログラムがあると思います)。私は大学のプロジェクトとしてこれをしたいし、それに必要な変更を加えることでLinuxに貢献したい。しかし、いくつかのサイトでこの質問をした後、彼らはLinuxソースコードは非常に巨大であると述べました。 minixを試してみてください。今、私はとても混乱しています。

この旅を開始する方法(ソースコードを変更してLinuxをカスタマイズする)の詳細と、必要な手順、および初級レベルの本をいくつか教えてください。

15
dubex

Unix.stackexchange.comへようこそ!

あなたの質問への簡単な答えはありません、そして私よりもfarより良い人々がLinuxカーネルとオペレーティングシステム一般についての本全体を書いています。

プロジェクトの範囲について:オペレーティングシステムの作成は簡単な作業ではありません。 Minixのような意図的に最小限のOSでさえ、かなり複雑なものです! Linuxについてのアイデアを与えるには、これまでに作成したCプログラムについて考えてください。平均的な大学の授業は、せいぜい数千行のCになる傾向があります。私の最終年度のプロジェクトは、約30〜35,000行のC++だったと思います。 Linuxカーネルは、約13,000,000行のCコードです。

なぜすべて別のファイルになっているのですか?サイズの大きいプロジェクトは、ロジスティック上の理由と実際的な理由により、別々のファイルに保存されます。 13,000,000行のファイルをエディターに読み込むことを検討してください! Linuxのような巨大なプロジェクトに取り組む前に、「複数のファイルを使用する理由」の質問がそれ自体で答えるところまで、Cスキルを磨く必要があります。 Cコードを読み取るだけでなく、書くこともできるはずです。 (最初よりも難しい)

あなたは間違いなくCに非常に精通している必要があります。カーネルは何千人もの人々によって保守されており、それぞれの個人的なCイディオムを理解するために呼び出されます(かなり厳格なカーネルコーディング標準内で許可されていますが、それでも誰もが持っています)独自の問題解決スタイル)。

C fuを入手したら、オペレーティングシステムを理解していることを確認してください。これは、コードを理解するのに役立ちます。 Linuxのすべてが必須というわけではありません。カーネル自体はかなり小さいです!それは何を膨らませる:

  • さまざまなデバイス用の数千のハードウェアドライバ。
  • APIとドライバーの記述を簡素化するためのさまざまなデバイスクラスの抽象化レイヤー。たとえば、ファイルシステムのVFS、入力デバイスのイベントレイヤーなどがあります。
  • Linuxを実行するさまざまなアーキテクチャに対応する、条件付きでコンパイルされたコードとファイルの驚くべき量(すべてのLinuxマシンがIntel PCであるわけではなく、一部は信じられないほど予想と異なる)。カーネルはこれらの違いに対処する必要があり、それはより多くのコードを意味します。

すぐにわかる1つの問題は、これらのコンポーネントを簡単に取り外したり、変更したり、再度接続したりできないことです。多くの相互関係があります。要するに、カーネルのビットを変更することはトリッキーです。

人々がMinixをあなたに提案した理由は単純です。それは完全なオペレーティングシステムですが、Linuxのような複雑なシステムのニーズによる負担はありません。コードは小さいですが、それでも完全な機能を提供します。結局のところ、Linuxの最初のバージョンはMinixに触発されたものです。

確かに、Minixは最近のハードウェアサポートが少なくなっています。だから何?それは朗報です!現代のコンピューターは非常にうまく仮想化されています。それをあなたの利点に利用してください:a VM Minixを実行するのはとても軽いので、開発を大胆にするでしょう。

プロジェクトがオペレーティングシステムを構築することである場合、Minixを勉強することよりもさらに悪い結果が生じる可能性があります。 Minixが同行するために書かれた本、「 Andrew Tanenbaum's Modern Operating Systems 」を購入して読むこともできます。

また、ターゲットを設定し、用語を定義する必要があります正確に。 OSの独自の定義がMicrosoftの定義である場合(GUIと完全なソフトウェアスイートを備えたOS)、非常に長いプロジェクトに参加している可能性があります。結局のところ、1960年代から数十万人が私たちを今いる場所に連れて来るために働いてきました。

最後に、コンピュータサイエンティストの戦いの叫びを覚えておいてください: ‘車輪を再発明しないでください!’(もちろん、学習時には例外を設けたいと思います。そして楽しみのために:))

29
Alexios

チェック Linux From Scratch プロジェクト。名前が示すように、独自のLinuxディストリビューションを構築するために必要なすべての詳細が含まれています

7
matcheek

最初に定義する必要があるのは「OSにどのような変更を加えたいか」です。あなたがこれを決めるまで、あなたは本当にどこにも行きません。学習の「1つの道」はありません。

さらに、OSの意味をより明確に定義する必要があると思います。 Ubuntuのソースコードの大部分(主要部分)はLinuxの外部にあります。 Linuxは カーネル のみです(これはオペレーティングシステムと呼ばれることもあり、特に学界では混乱しているためです)。 、したがって、次の "simple"ジョブがあります。

  • リソースの管理。
  • ハードウェアとの通信。

その他の変更は、コアユーザーランドユーティリティ(utilsと呼ばれることもある)、GUI、アプリケーションの基本的なアプリケーションであるかどうかに関係なく、異なるレベルで発生しますディストリビューションなど.

しかし、まだカーネルをハックする方法を学ぶことに専念している場合は、多分 この質問 から始める必要があります。これは、このサイトで最も投票された質問です;)

4
rahmu

これは少しおかしいかもしれませんが、Linuxカーネルについて学び、それを開発し始めたい場合は、本当に kernel newbies を調べてください。 (Alexiosが優れた方法で行ったように)カーネルの仕組みを理解できるサイトですが、処理する小さなタスク(いわゆるカーネル管理者)を選択することもできます。学ぶのに最適な方法です。ぜひお勧めします。

2
Tommy