Космос (операционная система)
Эта статья нуждается в дополнительных цитатах для проверки . ( май 2023 г. ) |
Разработчик | Космос Проект |
---|---|
Написано в | С# , Х# |
Рабочее состояние | Активный |
Исходная модель | Открытый исходный код |
Последний выпуск | Выпуск 20221121/21 ноября 2022 г |
Репозиторий | github |
Доступно в | Английский |
Платформы | х86 |
ядра Тип | Монолитный |
Лицензия | БСД |
Официальный сайт | www |
Управляемая операционная система с открытым исходным кодом C# ( Cosmos ) — это набор инструментов на основе графического пользовательского интерфейса и командной строки для создания операционных систем , написанный в основном на языке программирования C# высокого уровня и небольших количествах языка ассемблера под названием X#. Космос – это бэкроним , [1] в том, что аббревиатура была выбрана перед значением. Это программное обеспечение с открытым исходным кодом, выпущенное под лицензией BSD .
По состоянию на 2022 год [update]В состав Cosmos входит компилятор опережающего времени (AOT) под названием IL2CPU для перевода общего промежуточного языка (CIL) в собственные инструкции. Cosmos компилирует созданные пользователем программы и связанные библиотеки с использованием IL2CPU для создания загрузочного собственного исполняемого файла, который может работать независимо. Полученный результат можно загрузить с USB-накопителя , компакт-диска , по сети через среду предварительной загрузки (PXE) или внутри виртуальной машины . Последние выпуски также позволяют развертывать некоторые встроенные устройства x86 через универсальную последовательную шину ( USB ). Хотя C# является основным языком, используемым разработчиками (как серверными, так и конечными пользователями Cosmos), можно использовать многие языки CLI при условии, что они компилируются в чистый CIL без использования служб вызова платформы (P/Invokes). Cosmos в основном предназначен для использования с .NET .
Cosmos не стремится стать полноценной операционной системой, а скорее представляет собой набор инструментов , позволяющий другим разработчикам просто и легко создавать свои собственные операционные системы с использованием .NET. Он также функционирует как уровень абстракции , скрывая большую часть внутренней работы оборудования от возможного разработчика.
Старые версии Cosmos были выпущены в Milestones , последней из которых была Milestone 5 (выпущена в августе 2010 г.). Совсем недавно проект перешел на простое наименование новых выпусков по номеру последнего коммита.
Релизы Cosmos делятся на два типа: Userkit и Devkit . Userkit — это предварительно упакованная версия, которая обновляется нерегулярно по мере добавления новых и улучшенных функций. Пользовательские наборы обычно считаются стабильными, но не включают в себя последние изменения и могут не иметь функций. Комплекты разработчика, относящиеся к исходному коду Cosmos, обычно стабильны, но могут содержать некоторые ошибки. Их можно приобрести на GitHub и необходимо собрать вручную. [1] Git используется для управления системой контроля версий.
Большая часть работы над Cosmos в настоящее время направлена на улучшение функциональности отладчика и Microsoft Visual Studio интеграцию . Работа ядра сосредоточена на реализации файловых систем , управлении памятью и разработке надежного сетевого интерфейса. проекта Limine служит загрузчиком ; в старых версиях набора инструментов GRUB . вместо этого использовался [2]
Источник
[ редактировать ]Идея Cosmos была создана Чадом Хауэром и первоначально разрабатывалась совместно Хауэром и Маттейсом тер Вордом . Со временем Cosmos поддерживался и улучшался многими другими людьми.
Развиваемся вместе с Cosmos
[ редактировать ]Cosmos имеет множество возможностей для улучшения процесса разработки операционных систем и предназначен для того, чтобы сделать этот процесс максимально быстрым и безболезненным. Для использования Cosmos знание языка ассемблера не требуется.
Интеграция с Visual Studio
[ редактировать ]Ключевой особенностью Cosmos, отличающей ее от других операционных систем такого типа, является тесная интеграция с Microsoft Visual Studio . Код можно писать, компилировать , отлаживать и запускать полностью с помощью Visual Studio, всего лишь несколькими нажатиями клавиш. Cosmos больше не поддерживает Visual Studio 2015 , Visual Studio 2017 или Visual Studio 2019 , а поддерживает только Visual Studio 2022 .
Отладка
[ редактировать ]Cosmos можно легко отладить с помощью Visual Studio при работе через PXE или на виртуальной машине. Присутствуют многие стандартные функции отладки, такие как точки останова, трассировка и ведение журнала. Кроме того, отладку можно выполнять через последовательные кабели, если она работает на физическом оборудовании. При работе в VMWare Cosmos поддерживает пошаговое выполнение и точки останова даже во время работы операционной системы.
Бег
[ редактировать ]Cosmos использует виртуализацию , чтобы ускорить разработку, позволяя разработчикам тестировать свои операционные системы без необходимости часто перезагружать компьютеры. По умолчанию используется VMware Player, ввиду простоты его использования с точки зрения интеграции с проектом. Также поддерживаются другие среды виртуализации, такие как Bochs и Hyper-V. Также может быть создан образ диска ISO, который можно записать на флэш-накопитель USB, компакт-диск или аналогичный носитель.
Также поддерживается загрузка PXE, что позволяет удаленным компьютерам запускать Cosmos через сетевое соединение.
Процесс компиляции
[ редактировать ]Этот раздел содержит контент, написанный как реклама . ( Август 2023 г. ) |
IL2CPU
[ редактировать ]Чтобы скомпилировать .NET CIL в язык ассемблера, разработчики Cosmos создали современный компилятор под названием IL2CPU, предназначенный для анализа CIL и вывода x86 кодов операций . (IL To CPU) — это компилятор AOT , написанный с использованием языка, совместимого с Common Intermediate Language ( C# ). Он переводит Common Intermediate Language в машинный код .
Х#
[ редактировать ]X# низкого уровня, — это язык программирования разработанный для процессорной архитектуры x86 как часть операционной системы Cosmos. Его цель — упростить разработку операционных систем за счет включения языка C синтаксиса в язык ассемблера . Первоначально X# использовался для отладки служб в Cosmos. Компилятор X# — это (консоль) с открытым исходным кодом программа с интерфейсом командной строки , которая анализирует строки кода на токены, сравнивает их с шаблонами и преобразует совпавшие шаблоны в синтаксис Intel x86, обычно для ассемблера YASM. Ранние версии X# работали с ассемблерным кодом в основном 1:1, но сейчас это уже не так. [ нужны разъяснения ]
Синтаксис
[ редактировать ]Синтаксис X# прост, но более строг по сравнению C. с
Комментарии
[ редактировать ]X# поддерживает только однострочные комментарии в стиле C++, начиная с - //
.
Константы
[ редактировать ]X# позволяет определять именованные константы, объявленные вне функций. Числовые константы определяются аналогично C++ ; например:
const i = 0
. Ссылка на них в другом месте требует #
перед именем; например: - "#i"
.
- Строковая константа использует одинарные кавычки (
''
). Чтобы включить одинарную кавычку в строковую константу, используйте обратную косую черту (например,'I\'m so happy').
Строки X# завершаются нулем . - Шестнадцатеричные константы начинаются со знака доллара (
$
), за которым следует константа. ($B8000
). - Десятичные константы не имеют префикса, но не могут начинаться с
0
. - Двоичные и восьмеричные константы пока не поддерживаются.
Этикетки
[ редактировать ]Метки в X# функционируют аналогично меткам в других языках ассемблера. goto
мнемоника используется для перехода к метке вместо обычного jump
или jmp
мнемонический.
CodeLabel1:
goto CodeLabel2:
Пространства имен
[ редактировать ]Программные файлы X# должны начинаться с директивы пространства имен. В X# отсутствует иерархия пространств имен, поэтому текущее пространство имен меняется с каждой директивой, пока файл не закончится. Переменные или константы в разных пространствах имен могут иметь одно и то же имя, поскольку пространство имен предшествует имени члена в выходных данных сборки. Пространства имен не могут ссылаться друг на друга, кроме как посредством операций низкого уровня.
namespace FIRST
// Everything variable or constant name will be prefixed with FIRST and an underscore. Hence the true full name of the below variable
// is FIRST_aVar.
var aVar
namespace SECOND
// It's not a problem to name another variable aVar. Its true name is SECOND_aVar.
var aVar
namespace FIRST
// This code is now back to the FIRST namespace until the file ends.
Функции
[ редактировать ]Весь исполнительный код X# должен быть помещен в функции, определенные ключевым словом function. В отличие от C, X# не поддерживает формальное объявление параметров в заголовках функций, поэтому обычные круглые скобки после имени функции опускаются. Поскольку шаблоны с фиксированной строкой указаны в синтаксисе, реализованном в анализаторе кода, открывающую фигурную скобку нельзя разместить на следующей строке, в отличие от многих других языков C-стиля.
function xSharpFunction {
// function code
}
Поскольку X# является языком низкого уровня, в него не вставляются фреймы стека, поэтому по умолчанию обратный адрес EIP должен находиться на вершине стека. Вызовы функций X# содержат аргументы, заключенные в круглые скобки, в отличие от заголовков функций. Аргументами, передаваемыми функциям, могут быть регистры, адреса или константы. Эти аргументы помещаются в стек в обратном порядке. Обратите внимание, что стек на платформах x86 не может отправлять или извлекать однобайтовые регистры.
function xSharpFunction {
EAX = $10
anotherFunction(EAX);
return
}
function anotherFunction {
//function code
}
The return
Ключевое слово возвращает выполнение по обратному адресу EIP, сохраненному в стеке.
Арифметические и побитовые операции
[ редактировать ]X# может работать с тремя низкоуровневыми структурами данных: регистрами , стеком и памятью на разных портах. Регистры являются основой всех обычных операций X#. Регистр можно скопировать в другой, написав DST = SRC
в отличие от mov
или инструкции по загрузке/сохранению. Регистры можно так же легко увеличивать или уменьшать. Арифметические действия (сложение, вычитание, умножение, деление) записываются как dest op src
где src
является константой, переменной или регистром, и dest
является одновременно операндом и местом хранения результата.
Ниже приведены примеры присваивания и арифметических операций.
ESI = 12345 // assign 12345 to ESI
EDX = #constantForEDX // assign #ConstantForEDX to EDX
EAX = EBX // move EBX to EAX => mov eax, ebx
EAX-- // decrement EAX => dec eax
EAX++ // increment EAX => inc eax
EAX + 2 // add 2 to eax => add eax, 2
EAX - $80 // subtract 0x80 from eax => sub eax, 0x80
BX * CX // multiply BX by CX => mul cx -- division, multiplication and modulo should preserve registers
CX / BX // divide CX by BX => div bx
CX mod BX // remainder of CX/BX to BX => div bx
Сдвиг и прокрутка регистров аналогичны C.
DX << 10 // shift left by 10 bits
CX >> 8 // shift right by 8 bits
EAX <~ 6 // rotate left by 6 bits
EAX ~> 4 // rotate right by 4 bits
Другие побитовые операции аналогичны арифметическим операциям.
DL & $08 // perform bitwise AND on DL with 0x08 and store the result in DL
CX | 1 // set the lowest bit of CX to 1 (make it odd)
EAX = ~ECX // perform bitwise NOT on ECX and store the result in EAX
EAX ^ EAX // erase EAX by XORing it with itself
Куча
[ редактировать ]Манипулирование стеком в X# выполняется с помощью +
и -
префиксы, где +
помещает регистр, значение, константу или все регистры в стек и -
выдает значение в какой-либо регистр. Все константы помещаются в стек как двойные слова, если не указано иное (перемещение отдельных байтов не поддерживается).
+ESI // push esi
-EDI // pop into edi
+All // save all registers => pushad
-All // load all registers => popad
+$1badboo2 // push 0x1badboo2 on the stack
+$cafe as word // \/
+$babe as word // push 0xcafebabe
+#VideoMemory // push value of constant VideoMemory
Переменные
[ редактировать ]Переменные определяются в пространствах имен с помощью var
ключевое слово. Массивы определяются путем указания типа и размера. По умолчанию переменные и массивы обнуляются. Для ссылки на значение переменной используйте точку ('.'), а для ссылки на ее адрес используйте @
.
namespace XSharpVariables
var zeroVar // variable will be assigned zero
var myVar1 = $f000beef // variable will be assigned 0xf000beef
var someString = 'Hello XSharp!' // variable will be assigned 'Hello XSharp!\0',
var buffer byte[1024] // variable of size 1024 bytes will be assigned 1024 zero bytes
...
EAX = .myVar1 // moves value of myVar1 (0xf000beef) to EAX
ESI = @.someString // moves address of someString to ESI
CL = .someString // moves first character of someString ('H') to CL
.zeroVar = EAX // assigns zeroVar to value of EAX
X# может получить доступ к адресу с указанным смещением, используя квадратные скобки:
var someString = 'Hello XSharp!' //variable will be assigned to 'Hello XSharp!\0'
...
ESI = @.someString // load address of someString to ESI
CL = 'B' // set CL to 'B' (rewrite 'H' on the start)
CH = ESI[1] // move second character ('E') from string to CH
ESI[4] = $00 // end string
//Value of someString will be 'Bell' (or 'Bell\0 XSharp!\0')
Сравнение
[ редактировать ]Существует два способа сравнения значений в X#: чистое сравнение и сравнение if.
- Чистое сравнение оставляет результат во флагах, которые можно использовать в собственной сборке или с
if
ключевое слово без указания членов сравнения. - Если сравнение напрямую сравнивает два элемента после
if
ключевое слово.
Вот два способа записи (медленной) длины строки X# ( strlen
) функция:
// Method 1: using pure comparison
function strlen {
ESI = ESP[4] // get pointer to string passed as first argument
ECX ^ ECX // clear ECX
Loop:
AL = ESI[ECX]// get next character
AL ?= 0 // is it 0? save to FLAGS
if = return // if ZF is set, return
ECX++ // else increment ECX
goto Loop // loop...
//Way 2: using if
function strlen {
ESI = ESP[4] // get pointer to string passed as first argument
ECX ^ ECX // clear ECX
Loop:
AL = ESI[ECX]
if AL = 0 return// AL = 0? return
ECX++
goto Loop // loop....
}
Доступно шесть операторов сравнения: < > = <= >= !=
. Эти операторы можно использовать как в сравнениях, так и в циклах. Обратите внимание, что существует также побитовый оператор AND, который проверяет биты:
AL ?& $80 // test AL MSB
if = return // if ZF is 0, test instruction resulted in 0 and MSB is not set.
Написание кода Cosmos
[ редактировать ]Операционная система, созданная с помощью Cosmos, разрабатывается аналогично любой консольной программе .NET C#. В начале программы имеются дополнительные ссылки, которые предоставляют доступ к библиотекам Cosmos.
Пользовательский комплект и Visual Studio
[ редактировать ]Cosmos User Kit — это часть Cosmos, призванная упростить использование Cosmos разработчиками, использующими Microsoft Visual Studio . При установке пользовательский комплект добавляет в Visual Studio новый тип проекта, называемый проектом Cosmos. Это модифицированная версия консольного приложения, в которую уже добавлен компилятор Cosmos и код загрузочной заглушки.
Компиляция проекта
[ редактировать ]После завершения кода его можно скомпилировать с помощью Roslyn, компилятора .NET, либо через Microsoft Visual Studio , либо с помощью инструментов командной строки .NET (dotnet).
При этом приложение преобразуется из исходного исходного кода ( C# или другого) в Common Intermediate Language (CIL), собственный промежуточный язык .NET.
Затем процесс сборки вызывает компилятор IL2CPU , который систематически сканирует весь код CIL приложения (за исключением кода компилятора Cosmos), преобразуя его в язык ассемблера для выбранной архитектуры процессора. По состоянию на 2022 год [update], x86 поддерживается только архитектура . Затем Cosmos вызывает выбранный ассемблер для преобразования этого кода языка ассемблера в собственный центрального процессора (ЦП) код операции . Наконец, активируется желаемая опция вывода, будь то запуск виртуальной машины, запуск механизма PXE или создание файла образа диска ISO .
Параметры отладки
[ редактировать ]Cosmos предлагает несколько вариантов развертывания полученной ОС и отладки выходных данных.
Виртуализация
[ редактировать ]Cosmos позволяет пользователям загружать операционную систему в эмулируемой среде с помощью виртуальной машины . Это позволяет разработчикам тестировать систему на своем компьютере без необходимости перезагрузки, что дает преимущества, заключающиеся в отсутствии необходимости в дополнительном оборудовании или выходе из интегрированной среды разработки (IDE). VMware является основным методом виртуализации, однако поддерживаются и другие, такие как QEMU и Hyper-V.
Образы дисков
[ редактировать ]Эта опция записывает операционную систему в файл образа диска ( ISO-образ ), который можно загрузить в некоторые эмуляторы (например, Bochs , QEMU или чаще всего VMware ) или записать на USB-накопитель и загрузить на физическое оборудование.
PXE-загрузка по сети
[ редактировать ]Этот параметр позволяет операционной системе загружаться на физическом оборудовании. Данные отправляются через локальную сеть (LAN) на клиентский компьютер. Для этого требуются два компьютера: один в качестве клиентской машины (на которой загружается ОС) и один в качестве сервера (обычно машина разработки). Также требуется сеть, соединяющая два компьютера, клиентский компьютер с сетевой картой и базовая система ввода-вывода ( BIOS ), которая может загружаться с помощью PXE. По состоянию на 2022 год [update], отладка по сети больше не поддерживается.
См. также
[ редактировать ]Ссылки
[ редактировать ]Внешние ссылки
[ редактировать ]- Официальный сайт
- CosmosOS на GitHub
- Обзорная статья Cosmos на CodeProject
- Cosmos Dev Yahoo Group. Архивировано 8 января 2011 г. на Wayback Machine.
- Фанатская страница «Космоса» на Facebook