Linux ソース コードを変更してカスタム OS を作成するにはどうすればよいでしょうか?

Linux ソース コードを変更してカスタム OS を作成するにはどうすればよいでしょうか?

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

この旅(Linux をカスタマイズするためにソース コードを変更する)をどのように始めるべきかについて、必要な手順と初心者レベルの本を添えて、詳しいアドバイスをお願いします。

答え1

unix.stackexchange.com へようこそ!

あなたの質問に簡単に答えられるものではありません。遠い私よりも優れた人たちが、Linux カーネルやオペレーティング システム全般に関する本を書いています。

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

なぜすべてが別々のファイルになっているのでしょうか? 大規模なプロジェクトは、ロジスティックスと実用上の理由から別々のファイルに保存されます。13,000,000 行のファイルをエディターに読み込むことを考えてみてください。Linux のような巨大なプロジェクトに取り組む前に、C のスキルを「なぜ複数のファイルが必要なのか」という疑問に答えられるレベルまで磨く必要があります。また、Cコードを読む書くだけではなく、実際にやってみることです。(一見難しいように思えますが)

C 言語に非常に堪能であることは間違いありません。カーネルは何千人もの人によって保守されており、それぞれの人独自の C 言語の慣用句を理解することが求められます (かなり厳格なカーネル コーディング標準の範囲内ではありますが、それでも誰もが独自の問題解決スタイルを持っています)。

C の知識を身につけたら、オペレーティング システムを理解してください。これは、コードを理解するのに役立ちます。Linux のすべてが必須というわけではありません。カーネル自体は非常に小さいです。何が肥大化しているのか:

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

すぐに気付く問題の一つは、これらのコンポーネントを取り外し、交換し、再び接続することがそれほど簡単ではないということです。相互関係が多数あります。つまり、カーネルの一部を変更するのは困難です。

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

確かに、Minix は最近ハードウェア サポートが少なくなっています。だから何? それは利点です! 最近のコンピューターは仮想化が非常に優れています。これを有利に利用してください。Minix を実行する VM は非常に軽量なので、開発が遅くなります。

もしあなたのプロジェクトがオペレーティングシステムを構築することなら、Minix を学ぶことから始めるのがよいでしょう。また、Minix が書かれた本を買って読んでみるのもいいでしょう。アンドリュー・タネンバウムのモダン オペレーティング システム'。

目標を設定し、条件を定義する必要があります正確に. OS の定義が Microsoft の定義 (GUI と完全なソフトウェア スイートを備えた OS) と同じであれば、非常に長いプロジェクトになる可能性があります。結局のところ、現在の状況に到達するために、1960 年代から数十万人の人々が取り組んできたのです。

最後に、コンピュータ科学者の戦闘の雄叫びを思い出してください。「決して車輪の再発明をしないでください!(もちろん、学習時には例外を設けます。そして楽しみのためです :) )

答え2

チェックLinux をゼロから学ぶプロジェクト。名前の通り、独自のLinuxディストリビューションを構築するために必要なすべての詳細が含まれています。

答え3

最初に定義する必要があるのは、「OS にどのような変更を加えたいか」だと思います。これを決定するまで、実際には何も進みません。学習には「1 つの道」はありません。

さらに、OSの意味をもっと明確に定義すべきだと思います。Ubuntuのソースコードの大部分(主要部分)はLinuxの外部にあります。Linuxはカーネル、(時にはオペレーティング·システム(特に学術界では、混乱を招く)であり、そのため、"単純"仕事:

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

その他の変更は、コアユーザーランドユーティリティ(しばしばユーティリティ)、GUI、ディストリビューションの基本アプリなどです。

しかし、それでもカーネルのハッキング方法を学びたいのであれば、まずはこの質問このサイトで最も投票数が多い質問です ;)

答え4

これは少し的外れかもしれませんが、Linuxカーネルについて学び、開発を始めたい場合は、本当に調べてみるべきです。カーネル初心者このサイトは、カーネルの仕組みについての洞察を与えてくれるだけでなく (Alexios が素晴らしい方法で行ったように)、小さなタスクを選んで処理させることもできます (いわゆるカーネル管理人になる)。これは学習に最適な方法なので、強くお勧めします。

関連情報