Предыстория
Меня давно посетило желание создать свою ОС, но из-за незнания ничего не мог сделать. Первое что решил опробовать — создать дистрибутив на основе готового линукса: убунта, 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
НЕ НИЧО – ВСЕ НОРМАЛЬНО. КОМУ ИНТЕРЕСНЫ ОСКИ ПОЧИТАЕТ ДА И ПОПИШЕТ