Введение
Здравствуй, хабрасообщество! Не знаю, будет ли этот топик полезен кому-либо, но надеюсь, что вы почерпнете здесь для себя что-то новое. Цель данной статьи — познакомить хабраюзеров с проектом 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, жмем «Создать проект… » и видим такое окошечко:
Выбираем Cosmos C# Library и нажимаем ОК, после этого откроется окно со
стандартным кодом
Здесь мы будем писать логику нашей операционной системы. Для корректной работы вашей ОС требуется в каждом проекте выбрать конфигурацию Release! Иначе он просто не будет работать.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);
}
}
}
Стандартный код нам не понадобится, поэтому смело выпиливайте его! А теперь приступим непосредственно к написанию кода. Чуть не забыл упомянуть, что код может использовать любые объекты библиотек .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 help\nabout - information about the operating system\nshutdown - power off the computer\nreboot - 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\\Build\VSIP.
Ну что же, осталась самая малость: добавляем в метод Run() класса Kernel вызов метода CommandPrompt.Read():
Run()
protected override void Run()
{
CommandPrompt.Read(); //Считываем введенные с клавиатуры данные
}
Вот и все. Мы реализовали простейшие команды ОС, теперь остается только скомпилировать наш проект и запустить его на виртуальной машине.
Для этого жмем Построение->построить решение, сохраняем наш проект и открываем Visual Studio 2010 Shell. Нажимаем создать проект и видим данное окно:
Создаем Cosmos Project, и в References добавляем ссылку на .dll — файл, получившийся в результате построения проекта. Этот длл находится в папке нашего первого проекта\bin\debug. ВАЖНО! Если у вас не установлен VMWarePlayer или Workstation, то открываем свойства проекта и выбираем ISO Image, как показано ниже:
После этого так же нажимаем построить решение, ждем, так как построение выполняется сравнительно долго, и после успешного построения закрываем Visual Studio Shell, не забыв при этом сохранить проект. В итоге в папке второго проекта\bin\debug мы найдем .iso — файл. Его можно записать на диск или на флешку и грузить нашу ОС на реальном железе. Можете запустить в виртуальной машине нашу ОС и полюбоваться результатом :)
Итог
Вот и все! Я надеюсь, что вы узнали что-то новое, прочитав эту статью. Постараюсь ответить на все Ваши вопросы в комментариях, если что-то будет непонятно.