Singularityってありますが
こんなのもあるんだ(・∀・)
http://www.gocosmos.org/
http://www.codeplex.com/Cosmos/
ILからx86のCPUコードに変換してOS作るよ、みたいな。
記述がC#なだけで、やっていることは低レベルな世界。
Cosmos自体にはKernel、Sys(Filesystemとか)、Hardwareの名前空間があって。
Cosmos.Hardware.Network.Devices.RTL8139とかあるお(・∀・)ノ
User Kitをインストールして、テンプレートからプロジェクトを作るとこんな雛形が用意されますにょ。
using System; using Cosmos.Build.Windows; namespace CosmosBoot { class Program { // Most users wont touch this. This will call the Cosmos Build tool [STAThread] static void Main(string[] args) { var xBuilder = new Builder(); xBuilder.Build(); } // Main entry point of the kernel public static void Init() { Cosmos.Kernel.Boot.Default(); Console.WriteLine( "Usausa dayomon." ); while( true ); } } }
プロジェクトをビルドして実行するすると、Cosmosのビルドオプション画面が立ち上がって。
そこでBuildを実行すると、Init()メソッドの内容がバイナリとして作成*1されて、そのバイナリがQEMU*2で実行されます。
この辺の動きは下記の動画を参照。
http://www.gocosmos.org/Docs/Videos/UserKitInstallNew/
ちなみに、右上の画像はCosmosのソースに入っていたCosmos.Demos.Snake*3を実行したところ(´∀`)
キー入力はCosmos.Hardware.Keyboard.Initialize()で指定したdelegateで処理。
文字の表示はCosmos.Hardware.TextScreen.PutChar()でやっていますが、最初のロゴの表示はSystem.Console.Write()がコード変換されていますね。
その他、乱数にはSystem.Randomクラスを使っていたり、そのseedにはCosmos.Hardware.Global.TickCount()+Cosmos.Hardware.RTC.GetSeconds()をしていしていたりだとか。
個人的にはC言語で書かれたunderscorizeな関数名のソースよりも、Pascalな命名のC#で書かれたソースの方が読む気がわくし、こういんでコンピューターアーキテクチャーのお勉強って言うのも、面白くて良いんじゃない(・∀・)?