これは私が作成した最初のオペレーティングシステムです。 C言語とアセンブリの2つの言語で書かれています。
このプロジェクトは、2017年12月15日からアクティブ化されています

作業計画
ブートローダー
カスタム
ブートセクター
ステージ2
グラブ
カーネル
メモリ管理
ページフレームアロケーター
動的メモリ割り当て
構築システム
VGAにテキストを書きます
CPU割り込み(IDT、ISRS、IRQなど)
PS/2キーボードから文字を読み取ります
PS/2キーボードから文字列を読み取ります
仮想メモリ(ページング、フレームなど)
ページフレームの割り当てと脱アラケーション
動的メモリ割り当て(liballoc)
CPUタイマー
CPU情報を取得します
リアルタイムクロック:だから映画がいつ始まるかを知ることができます
カーネルスタックトレース
マルチタスク
ユーザーモードプロセス
ハードディスクドライバー
フロッピーディスクドライバー
ファイルシステム
グラフィカルユーザーインターフェイス
このOSは、2段階のブートローダーを使用します。第2段階が保護モードに入り、カーネルを呼び出すときの場合。
私のフロッピー画像の最初の512バイトには、保護されたモードができない多くのことを行うブートセクターが含まれています。 (例えば、ディスクからものをロードします)。次に、 0x7E00にロードされた第2段階にジャンプします(ブートセクターの直後)。
このステージはGDTをロードし、保護されたモードに入り、 0x1000から0x100000 (1 MB)のブートセクターがロードしたカーネルをコピーします。ついにジャンプ!
カーネルのサイズは常に成長していますが、私は常にセクターを増やすことはできません。解決策として。 Grubを使用することにしました。カーネルは、 ISO 9660ファイルシステムとして使用するCDにELF画像( kernel.img )として保存されます。 GrubはMultiBootもサポートしているため、オペレーティングシステムは他の人(Windows、Linuxなど)と連携することができます。
保護モードを入力しました。つまり、BIOS機能にアクセスできません。したがって、このカーネルは、ハードウェアを制御するためにこれらの機能を再実装する必要があります。
今、私は標準デバイスを再審査しました:画面とキーボード。さらなる開発で。ディスクドライバーを実装します。
このオペレーティングシステムは、セグメンテーションとページングの両方を使用して、メモリ保護を提供します。私のグローバルな記述子テーブルでは、5つのセグメント記述子を入れます。
ヌルセグメント
カーネルのコードセグメント:カーネルコードが属するセグメント
カーネルのデータセグメント:カーネルグローバル変数が属するセグメント
ユーザーのコードセグメント:現在使用していません
ユーザーのデータセグメント:4と同じ
ページングも有効にします。今、私は意図的に最初のページテーブルの4番目のページをnot-presentとread-onlyにマッピングしたので、OSのコマンドラインにbsodを入力することでページ障害を生成できます。

このカーネルはページフレームアロケーターを提供するため、メモリ管理の方が便利になり、マルチタスクに近づきやすくなります。
Jamesmのチュートリアルが示唆するように、ビットセットを使用して、フレームが無料かどうかを判断します。
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
カーネルで使用されるすべての変数が電源を切るまで解放する必要がないため、私は現在、無料のない配置マロックを実装しています。
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
私は怠zyなので、OSにはほとんど機能を必要とするliballocと呼ばれるサードパーティのメモリアロケーターを移植します。
このプロジェクトでは、GNU Makeを使用してビルドを使用しています。したがって、ビルドの方法は、ビルド中に問題が発生した場合、 make前にmake dep makeです。まだ立ち往生している場合は問題を開きます。
LinuxまたはWSL(Linux用のWindowsサブシステム)を使用していない場合は、ここからクロスコンパイラをダウンロードする必要があります。次に、 config.mkでCCとLDを変更します。