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#で書かれたソースの方が読む気がわくし、こういんでコンピューターアーキテクチャーのお勉強って言うのも、面白くて良いんじゃない(・∀・)?

*1:IL2CPUの処理後にnasm.exeが動いてます

*2:VMWareVirtualPCも選べるみたい

*3:ヘビが餌を食べると長くなっていくゲーム