2013-01-31 179 views
0

我是C#的新手,目前正在使用COSMOS爲我的操作系統類創建一個簡單的FileSystem。目前,我試圖實現一個「重新格式化」功能,當「控制檯重新格式化」一詞輸入到控制檯中時,操作系統(通過QEMU模擬)對磁盤進行分區。目前,這是我的代碼:Cosmos自定義操作系統,addmapping?

public static void console() 
    {    
     while (true) 
     { 
      Console.WriteLine("Console: "); 
      String input = Console.ReadLine(); 
      if (input == "exit") 
      { 
       Cosmos.Sys.Deboot.ShutDown(); 
      } 
      else if (input == "cpumem") 
      { 
       Console.WriteLine(Cosmos.Kernel.CPU.AmountOfMemory.ToString()); 
      } 
      else if (input == "restart") 
      { 
       Cosmos.Sys.Deboot.Reboot(); 
      } 
      else if (input == "devices") 
      { 
       var devices = Cosmos.Sys.FileSystem.Disk.Devices.ToArray(); 
      } 
      else if (input == "reformat") 
      { 
       try 
       { 
        Partition part = null; 
        for (int j = 0; j < Cosmos.Hardware.BlockDevice.Devices.Count; j++) 
        { 
         if (Cosmos.Hardware.BlockDevice.Devices[j] is Partition) 
         { 
          part = (Partition)Cosmos.Hardware.BlockDevice.Devices[j]; 
         } 
        } 
        var fs = new Cosmos.Sys.FileSystem.FAT32.FAT32(part); 
        uint cluster = 100; 
        fs.Format("newCluster", cluster); 
       } 
       catch 
       { 
        //Do Something warn user. 
       } 
      } 
     } 
    } 

最重要的是該位:

else if (input == "reformat") 
      { 
       try 
       { 
        Partition part = null; 
        for (int j = 0; j < Cosmos.Hardware.BlockDevice.Devices.Count; j++) 
        { 
         if (Cosmos.Hardware.BlockDevice.Devices[j] is Partition) 
         { 
          part = (Partition)Cosmos.Hardware.BlockDevice.Devices[j]; 
         } 
        } 
        var fs = new Cosmos.Sys.FileSystem.FAT32.FAT32(part); 
        uint cluster = 100; 
        fs.Format("newCluster", cluster); 
       } 
       catch 
       { 
        //Do Something warn user. 
       } 
      } 

這類似於什麼位置爲:http://cosmos-tutorials.webs.com/atafat.html

然而,當我運行它,我得到這個錯誤:

enter image description here

我相信牛逼他是因爲我缺少這條線:

Cosmos.System.Filesystem.FileSystem.AddMapping("C", FATFS); 
FATFileList = FATFS.GetRoot(); 

位於上面的鏈接。有沒有其他方法可以映射?或者我完全錯過了什麼? COSMOS的文檔並沒有多少意義,源代碼對於像我這樣的初學者來說,確實令人困惑,因爲它對於函數的工作方式或者它們的功能沒有任何評論。我使用的是舊版本的COSMOS(Milestone 4),因爲它是唯一適用於Visual Studio C#2008的版本。較新的版本只能在Visual Studio C#2010中運行。

+0

這是不對的。你說VMWare和你在QEMU中模擬它: - |。 –

+0

你對對不起 – Erasmus

回答

0

啊,我意識到這一點...必須調試在我自己工作的一個Cosmos項目(我使用VS2010兼容的Cosmos,但同樣的情況也可能適用於舊版本,以及...)的情況類似的情況下)

這可能會發生如果您嘗試呼叫一個空對象的方法。鍵入0x ........,方法0x ........特別提到編譯代碼中調用失敗的位置。 「未找到!」意味着找不到它正在查找的方法,可能是因爲您將它稱爲空引用。

我使用VirtualBox自己測試,發現如果您使用的是全新的空白硬盤映像,那麼將不會有分區。因此,條件將永遠不會滿足,您的分區將永遠不會被設置,然後Cosmos將嘗試在空分區上執行一個方法!

仔細看看你如何設置分區(它已初始化爲空)。對於初學者,每次「if(block device is partition)」條件滿足時,我都會打印一條簡單的消息......我願意打賭它永遠不會打印。

希望這會有所幫助......我仍然在學習有關Cosmos和自定義內核的知識,但是修復了我的案例中的空引用,解決了我發生的問題。如果這是問題,那麼下一步,當然,是搞清楚爲什麼你沒有得到任何分區的第一位...

其餘的代碼看起來好,但我不知道如何你實現了你的其他課程。內核調試可能是一場噩夢,祝你好運!