О нестандартном C#.Net или как я писал «свою» ОС

в 13:47, , рубрики: .net, операционные системы, ОС, Песочница

Предыстория

Меня давно посетило желание создать свою ОС, но из-за незнания ничего не мог сделать. Первое что решил опробовать — создать дистрибутив на основе готового линукса: убунта, opensuse… но ничего нормального не получилось, а желание создать самому меня не покидало.
И вот недавно я нашёл интересное дополнение к Visual Studio. Называется оно — Cosmos(многие наверное о нём знают).
Суть этого дополнения в том, что на разных языках программирования(F#.Net, C#.Net, VB.Net) вы можете создать свою ОС.

Создание ОС

Подготовка

Скачаем сам Cosmos: http://cosmos.codeplex.com/.
В установке нет ничего сложного.

Создание проекта

При создании нового проекта выбираем: CosmosProject -> C# Operating System. Вводим имя.
После этого создастся простейшая ОС. Её код следующий:

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

namespace Name
{
    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);
        }
    }
}

Как вы можете видеть код достаточно прост. На первый взгляд может показаться, что консоль — это всё, на что способен космос. Однако это не так. С помощью его создаются и графические интерфейсы для ОС. Если кого-то заинтересует, то он сможет найти в интернете ролики, демонстрирующие это.

При написании ОС можно использовать стандартные возможности C#. Всё работает достаточно быстро, однако перевести string в int при написании калькулятора у меня не получилось: всегда появлялась ошибка. По моему, это простительно, так как готовая ОС весит мало(моя вышла 2,1 мегабайт), хотя возможно что и я допустил где-то ошибку. Готовая ОС работает на линуксе(если я не прав — напишите об этом).

Улучшение ОС

Для начала сменил текст приветствия. Для этого в функции BeforeRun заменим существующий код на следующий:

Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("OS loaded");
Console.ForegroundColor = ConsoleColor.White;

Рассмотрим код:
Первая строчка поменяет цвет на зелёный. Вторая — выведет строку «OS loaded» на экран. Третья — вернёт белый цвет для последующего текста.
Добавим команды в нашу ОС и сделаем что-то похожее на полноценную ОС:
Для этого в функции Run заменяем код на:

Console.Write("> ");
var input = Console.ReadLine();
string[] array = input.Split(' ');
commands(array);

В этом коде:

var input = Console.ReadLine();

Получаем данные, которые ввёл пользователь

string[] array = input.Split(' ');

Разбиваем строчку на массив

commands(array);

Выполняем функцию, отвечающую за команды и передаём ей массив, созданный ранее(Сама функция будет написана чуть ниже).
Теперь приступим к написанию функции, отвечающей за команды.
Для этого создадим саму функцию с именем commands:

public void commands(string[] array)
{

}

В этой функции сделаем следующее: создадим переменную, в которой будет храниться команда и добавил обработчик.
Пишем следующий код:

var command = array[0];
if(command == "time"){
                var date = Cosmos.Hardware.RTC.DayOfTheMonth + "." + Cosmos.Hardware.RTC.Month + "." + Cosmos.Hardware.RTC.Year;
                var time = Cosmos.Hardware.RTC.Minute + ":" + Cosmos.Hardware.RTC.Hour;
                Console.WriteLine("Date: " + date + ". Time: " + time);
} else {
                Console.WriteLine("Unknown command!");
}

В этом коде мы добавили простую команду: вывод даты. Остальные команды можно добавить таким же способом, либо создавать классы и в них писать код, а в обработчике вызывать функцию из класса.
На этом простейшая ОС закончена. Запустить её можно как в виртуальной машине, так и записать на диск/дискету и запускать на обычном ПК.

Графика

Но как по мне, консольная ОС смотрится не красиво в наше время, да ещё и такая, которая почти ничего не умеет. Давайте добавил простой «графический интерфейс». Зальём весь экран одним цветом и выведем пиксель. Я создам новый проект и весь последующий код буду писать в функции BeforeRun:

var screen = new Cosmos.Hardware.VGAScreen();
screen.SetMode320x200x8();
screen.Clear(0);
screen.SetPaletteEntry(0, 255, 255, 255);
screen.SetPixel(1, 1, 1);

Рассмотрим код:

var screen = new Cosmos.Hardware.VGAScreen();

Создаём переменную, которая будет содержать в себе инструменты, для работы с графикой.

screen.SetMode320x200x8();

Задаём разрешение

screen.Clear(0);

Очищаем экран

screen.SetPaletteEntry(0, 255, 255, 255);

Очищаем всё

screen.SetPixel(1, 1, 1);

Выводим пиксель в координатах x=1, y=1 и задаём цвет(лично я не знаю, как он определяется. Кто знает — прошу написать)
На этом работа с графикой закончена. Так же можно добавить поддержку мышки и прочее, но так как мне оно не нужно, об этом я не читал и не написал здесь.

Автор: AlexRudkowskij


  1. JORJIK:

    НЕ НИЧО – ВСЕ НОРМАЛЬНО. КОМУ ИНТЕРЕСНЫ ОСКИ ПОЧИТАЕТ ДА И ПОПИШЕТ

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


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