Пользовательская ОС Cosmos, добавление карт?

Я новичок в C# и в настоящее время использую COSMOS для создания простой файловой системы для своего класса ОС. В настоящее время я пытаюсь реализовать функцию «переформатирования», которая, когда слово «переформатировать» вводится в консоль, ОС (эмулируемая через 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 (Milestone 4), так как она единственная работает с Visual Studio C# 2008. Более новые версии работают только в Visual Studio C# 2010.


person Erasmus    schedule 31.01.2013    source источник
comment
Это неправильно. Вы сказали VMWare и эмулируете его в QEMU :-|.   -  person Aniket Inge    schedule 31.01.2013
comment
упс ты прав извините за это   -  person Erasmus    schedule 31.01.2013


Ответы (1)


Ах, я понимаю это... пришлось отлаживать аналогичную ситуацию в проекте Cosmos, над которым я работаю сам (я использую Cosmos, совместимый с VS2010, но та же ситуация может относиться и к более старым версиям...)

Это может произойти, если вы попытаетесь вызвать метод для нулевого объекта. Тип 0x........, метод 0x........ специально указывает место в скомпилированном коде, где произошел сбой вызова. "Не найден!" означает, что метод, который он ищет, не может быть найден, по-видимому, потому, что вы вызвали его по нулевой ссылке.

Я сам тестировал VirtualBox и обнаружил, что если вы используете совершенно новый пустой образ жесткого диска, на нем не будет разделов. Таким образом, условие никогда не будет выполнено, ваш раздел никогда не будет установлен, а затем Cosmos попытается выполнить метод на нулевом разделе!

Посмотрите внимательно на то, как вы устанавливаете раздел (он инициализируется нулем). Для начала я бы печатал простое сообщение каждый раз, когда выполняется условие «если (блочное устройство является разделом)» ... Я готов поспорить, что оно никогда не будет напечатано.

Надеюсь, это поможет... Я все еще изучаю Cosmos и собственные ядра, но исправление нулевой ссылки в моем случае решило возникновение проблемы. Если это проблема, то следующим шагом, конечно же, будет выяснение того, почему вы не получаете никаких разделов в первую очередь...

Остальной код выглядит нормально, но я не уверен, как вы реализовали остальные классы. Отладка ядра может стать кошмаром, удачи вам!

person slickdeveloper    schedule 12.02.2014