# Необходимые знания
# Основная информация
Если вы думаете, что можете пропустить это, то это, вероятно, только для Вас.
Написание ОС - это не задача новичка. На самом деле, написание ОС обычно считается самой сложной задачей программирования. Вам понадобятся навыки программирования выше среднего, прежде чем даже рассматривать подобный проект.
Некоторые вещи, которые Вам нужно будет знать:
Основы информатики: Вы должны быть хорошо знакомы с шестнадцатеричной и двоичной системой, а также с булевой логикой и аналогичными фундаментальными знаниями, такими как структуры данных, их построение и манипулирование, алгоритмы поиска и сортировки, абстрактные концепции программирования и многое другое.
Язык и словарный запас: Вы должны уметь читать и писать на английском (техническом) на компетентном уровне. Практически вся техническая документация написана на английском языке, и большинство ресурсов, которые вы можете найти в Интернете (например, эта Вики и форум (opens new window)), также на английском языке. Из-за использования неправильной терминологии вы будете выглядеть глупо и запутаете людей, желающих Вам помочь.
Язык и словарь, №2: Большинство операционных систем, представленных на этом сайте, а также большинство фрагментов кода и примеров написаны на C (opens new window) (или C++ (opens new window)). Даже если вы решите использовать другой язык (например, FreeBASIC (opens new window) или Pascal (opens new window)), C (opens new window) - это основа программирования ОС, и вы должны быть компетентны в том, чтобы понять его.
Сборка: У Вас должны быть знания о низкоуровневой сборке языков. Прочитайте книги. Пройдите курсы. Напишите некоторый код пользовательского пространства, чтобы ознакомиться с ним. Он Вам понадобится, даже если вы планируете написать большую часть своей операционной системы на языке более высокого уровня.
Опыт программирования: Изучение программирования с помощью проекта ОС это очень плохая идея. Вы должны не только знать язык, на котором будете писать, но и быть знакомы с системами управления версиями, дебаггерами и т.д. Короче говоря, прежде чем написать ОС, лучше получить достаточно большой опыт в разработке обычных пользовательских программ(Желательно с использованием C/C++).
Практика в программировании: Вы должны знать, как писать как код, так и документацию, и быть готовыми тщательно документировать все аспекты вашего кода и дизайна, даже если проект предназначен исключительно для вашего личного использования. Кроме того, вы должны изучить и использовать подходящие методы управления кодом, включая настройку и использование внешних репозиториев (например, Savannah, GitHub, GitLab, Heroku).
Опыт работы с UNIX: Вскоре вы заметите, что многие инструменты, используемые при разработке ОС, разработаны для Unix и позже перенесены на Windows. Ядро Linux часто используется в качестве ссылки или примера того, как это можно сделать, и многие из операционных систем имеют некоторое сходство с Unix. Наличие опыта работы с командной строкой Unix (предпочтительно Bash или ksh) является очень важным требованием. (Cygwin (opens new window) предоставляет простую в установке командную строку Unix для Windows.) Если вы этого не сделали, попробуйте использовать Linux или BSD в течение некоторого времени. Для пользователей Windows это может быть достигнуто довольно легко с помощью систем виртуализации (см. Ниже) для размещения виртуальной системы без необходимости повторного разделения домашней системы. Вы также можете установить подсистему Windows для Linux (WSL) в самой Windows, чтобы получить доступ к командной строке Unix. Для пользователей macOS вы можете просто использовать терминал - macOS построен на ядре варианта Unix (комбинация ядер Mach и BSD), поэтому, пока у Вас установлен Xcode и эмулятор или виртуализатор, никаких дополнительных инструментов не требуется (хотя Вам нужно будет настроить кросс-компилятор).
Набор инструментов: Вы должны знать поведенческие детали вашего компилятора, сборщика, компоновщика и утилиты make. Вы должны знать, что означают выданные предупреждения и ошибки. У Вас должна быть документация по инструментам, которые вы используете, и вы должны сначала прочитать документацию, прежде чем обращаться к сообществу. Будьте уверены, что на любой возможный вопрос новичка о GCC (opens new window), GNU as (opens new window), NASM (opens new window), GNU ld (opens new window), Visual Studio (opens new window) и GRUB (opens new window) был дан ответ дважды. Ищите, прежде чем спрашивать.
Эмуляторы и виртуализаторы: Знакомство с такими инструментами, как Bochs (opens new window), VirtualBox (opens new window), QEMU (opens new window) или Virtual PC (opens new window), является основой в разработке ОС. Эти инструменты обеспечивают буфер между вашим реальным оборудованием и вашей тестовой системой.
Исполняемые форматы: Возможность анализировать исполняемые двоичные файлы (opens new window) является одним из требований к ядру (вы хотите, чтобы ваша ОС загружала и выполняла приложения, не так ли?) Ознакомьтесь с типами исполняемых файлов, их внутренней структурой и тем, как компоновщик создает их.
Платформа: Вы должны были изучить руководства по процессору, для которого будете программировать. Они содержат информацию, необходимую для разработки ядра в первую очередь. Запрос информации, которую можно легко получить из этих документов, приведет только к ответам "Прочитайте (...) Руководство" или просто RTFM (opens new window).
Концепция: Вы должны иметь представление о том, как функционируют существующие операционные системы на техническом уровне (например, прочитав несколько книг), что в них хорошего или плохого и как вы хотите работать со своей собственной ОС. Закончив какую-то книгу, а затем спросив "что теперь?" на одном из форумов, вы просто будете выглядеть глупо.
# Смотрите также
Особенно хорошая и превосходная (но, к сожалению, пока не законченная) книга на эту тему: Операционные системы от 0 до 1 (opens new window).