0

我是 C# 新手,目前正在使用 COSMOS 为我的 OS 类制作一个简单的 FileSystem。目前我正在尝试实现一个“重新格式化”功能,当在控制台中输入“重新格式化”这个词时,操作系统(通过 QEMU 模拟)对磁盘进行分区。目前这是我的代码:

   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

但是,当我运行它时,我收到此错误:

在此处输入图像描述

我相信这是因为我缺少这条线:

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

位于上面的链接中。有没有其他的映射方式?还是我完全错过了什么?COSMOS 文档并没有真正说明太多,对于像我这样的初学者来说,源代码确实令人困惑,因为它没有任何关于函数如何工作或它们做什么的评论。我使用的是旧版本的 COSMOS(里程碑 4),因为它是唯一适用于 Visual Studio C# 2008 的版本。新版本仅在 Visual Studio C# 2010 中运行。

4

1 回答 1

1

啊,我认识到这一点......必须在我自己正在处理的 Cosmos 项目上调试类似的情况(我正在使用与 VS2010 兼容的 Cosmos,但同样的情况也可能适用于旧版本......)

如果您尝试在空对象上调用方法,就会发生这种情况。类型 0x........,方法 0x........ 专门提到了编译代码中调用失败的位置。“未找到!” 意味着找不到它正在寻找的方法,大概是因为您在空引用上调用了它。

我自己在用VirtualBox进行测试,发现如果你使用的是全新的空白硬盘镜像,上面不会有Partitions。因此,条件永远不会满足,您的 Partition 永远不会被设置,然后 Cosmos 将尝试在 null Partition 上执行一个方法!

仔细看看你是如何设置分区的(它被初始化为空)。对于初学者,每次满足“如果(块设备是分区)”条件时,我都会打印一条简单的消息......我愿意打赌它永远不会打印。

希望这会有所帮助......我自己仍在学习 Cosmos 和自定义内核,但在我的案例中修复空引用解决了我出现的问题。如果这是问题所在,那么下一步当然是首先弄清楚为什么你没有得到任何分区......

您的其余代码看起来不错,但我不确定您是如何实现其余类的。内核调试可能是一场噩梦,祝你好运!

于 2014-02-12T04:25:43.717 回答