Пишем игрушечную ОС на C#

в 7:21, , рубрики: операционные системы, Песочница, метки: ,

image

Введение

Здравствуй, читатели! Не знаю, будет ли этот топик полезен кому-либо, но надеюсь, что вы почерпнете здесь для себя что-то новое. Цель данной статьи — познакомить читательов с проектом COSMOS и показать, как можно реализовать собственную ОС, заточенную под Ваши нужды. Кому интересно — прошу под кат.

Знакомимся с COSMOS

Вот что нам говорит википедия:

Cosmos является бэкронимом от C# Open Source Managed Operating System (рус. «Управляемая операционная система с открытым кодом на C#»). Cosmos в настоящее время не стремится стать полноценной операционной системой, а скорее набором инструментальных средств, позволяющим другим разработчикам легко и просто создавать свои собственные операционные системы, или, как сказал один из руководителей проекта, действовать в качестве «операционной системы типа Lego». Он также функционирует как абстракционный слой, скрывающий значительную часть работы внутренних аппаратных средств.

Cosmos является конструктором, который позволяет полностью отвлечься от низкоуровнего программирования и писать на чистом C#.

Что нам потребуется?

В первую очередь, нам понадобится Microsoft Visual Studio 2010, предпочтительно Pro. Если Вы используете Express-версию, то Вам понадобится установить Microsoft Visual Studio Shell. Скачать все это добро:

Так же нам потребуется скачать и установить сам Cosmos User Kit. Кроме того, нам потребуется любая виртуальная машина для тестирования нашей операционной системы. Лично я использую QEMU и Virtual Box.

Начинаем кодить

Расчехляем Visual Studio, жмем «Создать проект… » и видим такое окошечко: Пишем игрушечную ОС на C#
Выбираем Cosmos C# Library и нажимаем ОК, после этого откроется окно со

стандартным кодом
using System;
using System.Collections.Generic;
using System.Text;
using Sys = Cosmos.System;

namespace CSharpKernel1
{
    public class Kernel : Sys.Kernel
    {
        protected override void BeforeRun()
        {
            Console.WriteLine("Cosmos booted successfully. Type a line of text to get it echoed back.");
        }

        protected override void Run()
        {
            Console.Write("Input: ");
            var input = Console.ReadLine();
            Console.Write("Text typed: ");
            Console.WriteLine(input);
        }
    }
}

Здесь мы будем писать логику нашей операционной системы. Для корректной работы вашей ОС требуется в каждом проекте выбрать конфигурацию Release! Иначе он просто не будет работать.
Стандартный код нам не понадобится, поэтому смело выпиливайте его! А теперь приступим непосредственно к написанию кода. Чуть не забыл упомянуть, что код может использовать любые объекты библиотек .NET Framework, которые поддерживает Cosmos (либо переводом объекта в машинный код, либо каждую из его частей). Он также может вызвать любую библиотеку, встроенную в Cosmos. Для начала разберемся с классом Kernel.

Kernel

using System;
using System.Collections.Generic;
using System.Text;
using Sys = Cosmos.System;

namespace CSharpKernel1
{
    public class Kernel : Sys.Kernel
    {
        protected override void BeforeRun() /*Этот метод вызывается самым первым и выполняется только один раз. Его удобно использовать для инициализации компонентов. */
        {
            Console.ForegroundColor = ConsoleColor.Green; 
            //Цвет текста - зеленый
            Console.WriteLine("Welcome to HabrOS! Type "help" and then press "ENTER" to get some help.");
            //Выводим на экран приветствие
            Console.ForegroundColor = ConsoleColor.White;
            //Цвет текста - белый, как и по умолчанию. ВНИМАНИЕ! Метод Console.ResetColor() НЕ будет работать!
        }

        protected override void Run() //Данный метод вызывается постоянно, в нем мы разместим логику.
        {
        }
    }
}

Это, так сказать, каркас нашей ОС. Теперь добавим в проект класс CommandPrompt, который будет отвечать за ввод и выполнение команд.

CommandPrompt

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ScorpionOS
{
    class CommandPrompt
    {
        public static void Read() { //Этот метод будет считывать с клавиатуры вводимый юзером текст
            Console.Write("->");
            String ln = Console.ReadLine(); //Считываем введенный текст и записываем его в переменную ln
            switch (ln)
            {
                case "help": //Помощь
                    Console.ForegroundColor = ConsoleColor.Cyan; //Цвет текста - бирюзовый
                    Console.WriteLine("To run a program, type name of program and press enter.");
                    Console.WriteLine("The following commands are available:");
                    Console.WriteLine("help - get helpnabout - information about the operating systemnshutdown - power off the computernreboot - reboot the computer");
                    Console.ForegroundColor = ConsoleColor.White; //Не забываем вернуть стандартный цвет
                    break;
                case "about": //Об ОС
                    Console.WriteLine("HabrOS ver. 0.01 beta.");
                    break;
                case "shutdown": //Выключение компьютера
                    Cosmos.Sys.Plugs.Deboot.ShutDown();
                    break;
                case "reboot": //Перезагрузка
                    Cosmos.Sys.Plugs.Deboot.Reboot();
                    break;
                default: //Любая другая введенная строка
                    Console.ForegroundColor = ConsoleColor.Red; //Думаю, здесь уже все понятно
                    Console.WriteLine("ERROR: Command not found");
                    Console.ForegroundColor = ConsoleColor.White;
                    break;
            }
        }
    }
}

Для корректной работы данного класса нам требуется добавить ссылку на библиотеку Cosmos.Sys.Plugs.dll. Она находится здесь: С:папка_установки_cosmosUserKit\BuildVSIP.
Ну что же, осталась самая малость: добавляем в метод Run() класса Kernel вызов метода CommandPrompt.Read():

Run()
protected override void Run()
        {
            CommandPrompt.Read(); //Считываем введенные с клавиатуры данные
        }

Вот и все. Мы реализовали простейшие команды ОС, теперь остается только скомпилировать наш проект и запустить его на виртуальной машине.
Для этого жмем Построение->построить решение, сохраняем наш проект и открываем Visual Studio 2010 Shell. Нажимаем создать проект и видим данное окно:Пишем игрушечную ОС на C#
Создаем Cosmos Project, и в References добавляем ссылку на .dll — файл, получившийся в результате построения проекта. Этот длл находится в папке нашего первого проектаbindebug. ВАЖНО! Если у вас не установлен VMWarePlayer или Workstation, то открываем свойства проекта и выбираем ISO Image, как показано ниже:image
После этого так же нажимаем построить решение, ждем, так как построение выполняется сравнительно долго, и после успешного построения закрываем Visual Studio Shell, не забыв при этом сохранить проект. В итоге в папке второго проектаbindebug мы найдем .iso — файл. Его можно записать на диск или на флешку и грузить нашу ОС на реальном железе. Можете запустить в виртуальной машине нашу ОС и полюбоваться результатом :)

Итог

Вот и все! Я надеюсь, что вы узнали что-то новое, прочитав эту статью. Постараюсь ответить на все Ваши вопросы в комментариях, если что-то будет непонятно.

Автор: Scorpion97

Источник


  1. Дмитрий:

    Классная статья! Спасибо автору :)

  2. Михаил:

    а под дебиан?

  3. Павел:

    При запуске кидает ошибку…. ХЗ какая.. там не разобрать… просто.. КАК СОБРАТЬ ОСЬКУ?

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js