web-dev-qa-db-ja.com

独自のカーネルを構築する意欲的な学生へのアドバイス

私は非常に野心的な大学生で、コンピューターについて知っておくべきことのほとんどすべてを学びたいと思っています(もし望むなら、私をたたいてください、私は学習が大好きです)。最近、私は自分のカーネルを設計して構築するのは(長いプロジェクトではありますが)楽しいプロジェクトだと思いました。

基本的な情報をいくつか入手しましたが、実際にこれを機能させるには、アセンブリとC/C++を習得する必要があると収集しました。私がそれらに取り組んでいる間、私はカーネルがプログラミングの観点から実際にどのように機能するかを学びたいです。 Linuxカーネルのコードの閲覧に何時間も費やしてきましたが、それはこれまでのところしかかかりません。

カーネルを構築する基本的な手順は何ですか?対処する必要があることは?注文するか、何かする?私はたくさん噛んでいることを知っていますが、それを処理するのに十分な決意を持っています。

18
n0pe

オペレーティングシステムを設計する必要があります。たとえば、UNIXライクなシステムにすべきだと決めたとしても、決定することはまだたくさんあります。どの程度UNIXになりたいですか? UNIXのどの部分が好きで、どの部分に改善が必要だと思いますか?

UNIXライクであることに慣れていない場合、答えるのはmoreの質問に終わります:プロセスはツリーを形成するか、それとも"平らな"?どのようなプロセス間通信をサポートしたいですか?あなたはそれをマルチユーザーにしたいですか、それともマルチタスク(またはおそらくシングルタスク)にしたいですか?リアルタイムシステムにしたいですか。タスク間にどの程度の分離を提供しますか?モノリシックスケールとマイクロカーネルスケールのどこに配置しますか?分散操作をどの程度(もしあれば)サポートしたいですか?

私は一般に、インスピレーションを得るためにLinuxカーネルを研究する反対に助言します。これはLinuxカーネル自体には何の問題もありませんが、Linuxは教育ではなく主に本番環境での使用を目的としているという単純な事実があります。多くの最適化、下位互換性ハックなどがあり、制作には非常に役立ちますが、教育よりも注意散漫になる可能性が高くなります。

見つけた場合は、ライオンの本のコピー(NIXの第6版ライオンズの解説ソースコード(John Lions著)は、はるかに簡単な出発点です。第6版のUNIXはまだ非常に小さく、シンプルなので、非常に単純化されたおもちゃのシステムではなく、かなり速く読んで理解することができました。

(少なくとも主に)x86を対象とする場合は、Richard BurgessによるMMURTL V 1.0も参照してください。これは、CPU設計者が当初意図していたよりも多くのx86ハードウェアを使用するx86システムを示しています。ほとんどの実際のシステムは、他のCPUへの移植性を優先しています。ご想像のとおり、これはハードウェア側に集中する傾向があります。印刷されたコピーは高価で見つけるのが難しいようですが、無料で テキストとコードをダウンロード できます。

幸いにも、たとえば、Andrew TanenbaumやAlbert Woodhullによる、さらに多くの可能性があります-オペレーティングシステムの設計と実装

35
Jerry Coffin

私は小さな、非常に焦点を当てたタスクから始めることをお勧めします:アセンブリを使用して、おもちゃを書くbootstrapプログラム。多くのことをする必要はありません。コンピュータにプログラムを自動的にロードさせるだけです。起動したら、実行中であることを確認するメッセージを出力し、キーボードから入力を読み取り、別のメッセージを出力して、コンピュータをシャットダウンします。

これにはいくつかの利点があります。

  1. 最終的には、カーネルにbootstrapプロセスが必要になるため、無意味な演習にはなりません。
  2. それはあなたにアセンブリで書くことの練習を与えます。
  3. 低レベルのIOルーチンを書く練習になります。どのように画面にメッセージを書き込んだり、呼び出すOSがないときにキーストロークを読んだりしますか?
  4. CPUとマザーボードの技術的な特徴に関する研究を行った経験が得られます。 (最初の質問:起動時に、マザーボード/ CPUはどのようにして起動可能なプログラムを見つけますか?)
  5. カーネルの作成は非常に洗練された作業になり、微妙な問題が山積しています。このタスクは、最初に何かを提供し、多分あなたが始める前に雑草で迷子になるのを防ぎます。

これができるようになれば、何をしようとしているのかをずっとよく理解できるようになります。

11

アセンブラーでプログラムする方法を学ぶことは、最初の良いスタートであり、MSDOS 6.0からそれを行うことも、組み込み機能がないために役立つかもしれません。

オペレーティングシステムの概念などの優れた本を読むことは、独自のカーネルを設計するための公正な出発点になります。ブートロード、デバイスドライバー管理、BIOSとのインターフェイス、ファイルシステムの作成と管理、プログラムのスケジューリング、プログラムのロードとアンロードを処理し、少なくとも何らかのシェルを実装する必要があります(ウィンドウシステムを構築するよりもはるかに簡単です)。

C/C++は、カーネルがこれらの言語の標準ライブラリと互換性がある場合にのみ機能します。そうでない場合は、これらのライブラリのコピーも作成する必要があります。

それは、マルチスレッド、システムセキュリティ、ネットワーキングについてさえ考え始めていません。

7
Peter Smith

Minixは、ニースのUnixクローン(Linuxに影響を与えた)で、教育用に作成されました。

Andrew S. Tannenbaumは優れた作家であり、教師であり、例としてMinixを使用したオペレーティングシステムに関する本全体を執筆しています(それに続くソースコードも含まれています): http://en.wikipedia.org/wiki/Operating_Systems:_Design_and_Implementation

個人的に私は彼がプログラマーよりもいくらか優れた作家であることを発見しました。

これを学習リソースとして検討することを強くお勧めします。また、実際に役立つものを実際に作成するために必要な作業量についても説明します。

7
user1249

私もそれを学んでいます。これらのリソースをチェックしてください。彼らはとても良いです!

http://www.osdever.net/tutorials/index

http://kernelnewbies.org/

途中で楽しんでください!

4
setzamora