#:オペレーティングシステムを構築するためのトレーニングセッション。ゼロから始めて、 AMDとIntelのリソースのみを使用します。
まだアルファステージにあります
このリポジトリはまだ磨かれておらず、アルファ段階でまだ見なす必要があります。コードはコンパイルして作業する必要がありますが、テキストメッセージは、私がコーディングと調査中に以外に、私がメモした最初のドラフトにすぎません。
他のチュートリアルとは何ですか?
多くのチュートリアルがあり、私が提示する資料の大部分についても説明しています。では、なぜわざわざなのですか?私は特に好きで、これらに触発されました:
- Phil Todo:リンク
- Intermezzos:TODO:リンク
このバージョンの違いは何ですか?新しいことを学ぶとき、私はしばしば、私が次回自分で完全にやったことをどのようにできるかわからない/学ぶことができないという感覚を持っています。それが私が学ぶ方法なのか、それともチュートリアルを書くときに簡単に省略できる典型的なことなのかはわかりません。ここに私が定期的に疑問に思っているいくつかのポイントがあり、私が対処したいと思っています(私はおそらくそれを補うために他の重要なものを見逃すでしょう)
- 単に合意された慣習、標準とは何か、アーキテクチャ固有のものについての詳細をいくつか提供します。ティーンエイジャーとしてプログラミングを最初に学び始めたとき、私は「uuhh ...コンピューターが最初に呼び出されなければならないことをどのように知っているのか」のようでした。それは単なる「魔法」でした。これらのことは私を悩ませています、私は物事がどこから来るのかを理解したいです...
- 標準を指して、そこから作業します。コピーするだけの完成したソリューションは提示しません。私たちは標準を取り、実際に物事を調べます。 x86_64マシンの代わりにアーム皮質をたとえば、コードを実行したい場合と同じように。または、違った方法で、もし私たちがチュートリアルを書いた最初のものになるとしたら、そのブートローダーをどのようにして、割り込みを構成するか、CPUを最初に64ビットモードにしますか?
- 物事を二度します。最初に裸の骨に行きます。これは何が起こっているのかを理解するのに役立ちます。その後、ツールを使用して、毎回その地上作業を避けます。
- 中級ステップと「チェックポイント」
- 最初にアウトラインを与える - >より大きな画像を見るには
- 実際のコードに例を挙げてください - >例えば、最初のカーネルビンは実際にLinuxの構築方法であることを示しています
- 使用を開始する各
dependencyの代替/選択を提示します。私にとっては、チュートリアルに従い、多くの外部ライブラリが私が実際に学びたい魔法をしたいなら、それは残念です。
概要
私がやりたいことの大まかな概要。うまくいけば、多かれ少なかれ年代順に。ポイントは、私たちができることがたくさんあるということです。実際にパスを選択するのは非常に難しいことです。
まず、ブートプロセスをよりよく理解したいと思います。ブートローダーが飛び込む前に何が起こるか。実際に独自のブートローダー(Osdevへのリンク)を転がすことは、それ自体が大きなタスクです。
私の計画は、ブートプロセスの初期段階を少し探求することです。その目標は、ブートローダーが私たちのために何をしているかを理解し、評価することです。最後に、さまざまなプロセッサモード、提供するもの、32ビット保護モードに切り替える方法を大まかに理解したいと思います。具体的な目標は、保護されたモードに切り替えてHello World!画面に。すべてがアセンブリに実装され、ブートローダーを使用せずに実装されています。
その後、Grubをブートローダーとして切り替えて使用する予定です。そこから続けます。
tl; dr
- 最小限の起動可能な画像を書きます。
- 16ビットリアルモードで
Hello Worldを印刷するブートローダー。 - 32ビン保護モードに手動で切り替えて、
Hello Worldを印刷します。 - 64ビンロングモードに手動で切り替えます
- Grubをブートローダーとして使用し、
Hello Worldを印刷します。 - ロングモードに切り替えます(もう一度)。
-
Cにジャンプして、 Hello Worldを印刷します。 - スタック
- VGAビデオドライバーを実装します。
- 割り込み(パート1)-ASMでハンドラーを見つける場所をCPUに伝える
- 割り込み(パート2) - コードを10からCに移動する
- より良いハンドラーを実装します
- デバッグ
- 割り込み/例外を処理します
- メモリページングを実装します。
- カーネルのリマップ
不特定:
- リファクタリング?
- ユーティリティ(Memset?)
後で...
- ファイルシステム
- プロセス
- スケジューリング
- システム呼び出し
- スタックを探索し、スタックのオーバーフローと例外を引き起こします
- UART経由でGDBに接続します(デバッグおよび組み込みプレビュー用)
- アームプロセッサにいくつかの(または多くの)パーツをクロスコンパイルします。 (私は未使用の周りに横たわっているSTMとインフィニオンボードを持っています)
前提条件?
なし。真剣に、怖くないでください。このチュートリアルの全体的なポイントは、必要なすべての知識をゼロから開発することです。私が想定する条件は1つだけです。つまり、きちんとプログラムできるということです。まともなことで、私はあなたが少なくともスタックとヒープについて聞いたことがあり、一部の言語で生産的になる可能性があることを意味します。それで十分だと思います。結局のところ、私たちはここで次の世代の主流OSを開発しようとはしていません。趣味レベルでいじくり回しています。
そして、私があなたを保証できることの一つ:あなたがこのコードを二度と触れず、OSを書くこともないとしても。この経験は、あなたが深く取り組んでいるシステムの理解を変えます。カーネルレベルでの発展から得られる知識は、あなたのキャリアを通じて種のように広がり、洞察は最も予想外の瞬間に有用であることが証明されます。
ScratchPad(ここから組織化されていないアイデア)
アイデア
- 最初の512バイトの後に指示を出した場合、CPUは何をしますか?それらは実行されていますか? (CPUは16ビットのリアルモードです)
概要
- ブートロード - > 2つの選択肢は独自のロールまたは既存の使用、例えばgrubを使用します。
- 16ビットモード
- 32ビット保護モードの入力
- 64ビットロングモードに入ります
- cを入力します
- メモリ管理モジュールを書き込みます
サイクル0-環境と相互コンパイルツールチェーン
- いくつかの手順をスキップできます。 Cコードの作成を開始する前に、クロスコンピレーションツールチェーンは必要ありません。
- $ homeの下のどこかにツールチェーンの構築を開始します
- 環境変数の範囲が正しいことを確認してください
- 「ディレクトリ
/usr/lib/i686-elfを作成する許可がない」などのエラーは、 $PREFIXが正しく設定されていないことを示しています。 - 「本物の」ベアボーンCPUを取得していませんが、私たちの前にはまだBIOSがあります。 CPUを初期化し、実際のモードでCPUを使用して私たちに引き渡します。
サイクル0-ブートローダー
リソース
- NASMドキュメントhttps://www.nasm.us/xdoc/2.14.02/html/nasmdoc3.html
- Intelマニュアル