# Начало работы

# Основная информация

Во-первых, разработка операционной системы, вероятно, является одной из самых сложных вещей, которые вы можете сделать на компьютере (после убийства финального босса в Doom на уровне сложности Nightmare). Создание операционной системы требует больших знаний о нескольких сложных областях информатики. Вы должны понимать, как работает аппаратное обеспечение, и уметь читать и писать сложный код на языке ассемблер, а также язык более высокого уровня (например, C, C++ или Pascal). Ваш ум должен быть способен обернуться вокруг абстрактной теории и удерживать мириады мыслей. Чувствуете себя обескураженным? Не бойся! Потому что все эти вещи также являются тем, что делает программирование ОС веселым и интересным.

Нет ничего лучше чувства выполненного долга, когда вы, наконец, после нескольких часов борьбы, решаете проблему. И через некоторое время вы сможете оглянуться назад и увидеть все, что вы создали с нуля. Ваша рукописная система способна загружаться, выполняет магию вопреки оборудованию и предоставляет пользователю интерфейс и программы для игры.

При создании ОС не существует абсолютного пути, по которому вы должны следовать. Как только вы запустите свою начальную систему (и вы сделаете это, найдя соответствующие учебные пособия), вы выберете путь, по которому хотите идти дальше. Ваша ОС именно такая, какая вам нужна. У вас есть абсолютный контроль, и только небо - это предел!

# Суровая правда

Надеюсь, основной факт, что разработка операционной системы является сложным и непрерывным процессом, не обескураживает вас. Правда в том, что разработка операционной системы действительно не имеет себе равных, поскольку она требует предельного терпения и тщательного проектирования кода, и она приносит очень мало "мгновенного удовлетворения", которое вы получаете от разработки таких вещей, как игры и веб-сценарии.

Вы были справедливо предупреждены о предстоящей тяжелой работе, но если вы все еще заинтересованы, то переходите в область программиста операционной системы. Приготовьтесь к случайным приступам замешательства, уныния, а для некоторых из нас... Временного безумия. Со временем и с достаточной самоотдачей вы окажетесь среди немногих избранных, которые внесли свой вклад в рабочую операционную систему. Если вы все же впадете в уныние по пути, освежите себя содержанием этого сайта. Надеюсь, это напомнит вам, почему вы начали такое безумное путешествие в первую очередь.

На этом этапе было бы также полезно прочитать страницу Ошибок начинающих. Пользователи на форуме (opens new window) заметили, что многие из этих ошибок повторяются с течением времени, и избежать их - отличный способ не выставлять себя дураком.

# Ответственность

Люди склонны утверждать, что писать неэффективное программное обеспечение - это нормально, заявляя, что компьютерные системы в наши дни работают так быстро, что вы не увидите последствий. Такой тип мышления опасен при проектировании операционной системы. Возможно, было бы нормально писать небрежный код при создании простого приложения, но когда дело доходит до критического кода, который может вызываться тысячи раз в секунду, вам нужно убрать всё, что может замедлять этот код. Операционная система должна предоставлять компьютер в качестве основного ресурса для запущенных приложений с минимальным усложнением, абстракцией и минимальными задержками, насколько это возможно.

# Требуемые знания

Если вы думаете, что можете пропустить этот раздел, то пожалуйста, ознакомьтесь со страницей Требуемые знания

# Организуйте свои планы

Прежде чем продолжить, подумайте, что вы хотите получить от написания операционной системы. Каковы ваши мотивы при принятии этого проекта? Существует множество возможных причин для того, чтобы взяться за проект ОС для хобби, и у большинства разработчиков ОС их несколько. Даже простого слова "Я просто хочу" может быть достаточно, хотя чем больше вы обдумываете и проясняете свои цели и мотивы, тем больше вы можете сосредоточиться на том, чего действительно хотите.

Будьте честны и с самим собой. Нет ничего постыдного в том, чтобы иметь большие амбиции для вашего проекта, даже (или особенно), если они не являются основной целью. Постарайтесь осознать все свои цели, а не только ту, которую вы считаете своей главной целью.

Попробуйте определиться с тем, какие аспекты конструкции ОС вас больше всего интересуют или над которыми вы видите необходимость работать. Большая часть того, что входит в разработку ОС, особенно на ранних стадиях, - это проектирование и разработка ядра, но само ядро - это лишь небольшая часть большинства операционных систем; если ваш основной интерес связан с UX, сетями или программированием драйверов, вам следует подумать о том, действительно ли вам нужно (сейчас или в будущем) вообще писать свою собственную ОС или вы были бы так же удовлетворены разработкой этих вещей на существующем ядре. Многие люди занимались разработкой ОС, когда они действительно хотели создать среду рабочего стола, поэтому это очень важный вопрос, который нужно задать себе.

Попробуйте подумать о любых проектах, не связанных с ОС, которые вы, возможно, захотите взять на себя в первую очередь или в то же время, особенно о тех, которые могут служить практикой или подготовкой к проекту ОС. Обычно нет необходимости работать над проектом ОС прямо сейчас, и чем больше вы подготовитесь заранее, тем лучше вам будет (по крайней мере, до определенного момента - подготовка - это одно, прокрастинация - это что-то другое).

# Выбор окружения для разработки

Вам нужна платформа для разработки вашей новой системы. Следуя тенденциям общих вычислений, наиболее популярным является GNU/Linux, но многие также используют Windows. Разработчики, использующие систему GNU/Linux, имеют небольшое преимущество в доступности инструментов, но это можно решить в Windows с помощью таких систем, как Cygwin (opens new window) или MinGW (opens new window).

  • Binutils: Основные инструменты для манипулирования объектными файлами.
  • GCC: Коллекция Компиляторов GNU. GCC содержит компиляторы для C, C++, Fortran и Ada, среди прочих.
  • Make: Для автоматизации процесса сборки, который становится действительно полезным, когда у вас есть более нескольких файлов.
  • Grep и sed: Для более быстрого поиска и замены (полезно при заполнении таблиц данными).
  • Diffutils: Невероятно полезно для отображения различий между двумя файлами.
  • Perl или Python: должен быть установлен один из этих двух скриптовых языков. Полезно для манипуляций со строками. Perl раньше был рекомендацией, но Python теперь довольно зрелый и его легче выучить. Оба имеют сотни пакетов/модулей, доступных для выполнения различных задач.
  • Ассемблер: например, NASM или GAS. Это зависит от вашей целевой архитектуры процессора.
  • Редактор: Для записи вашей сборки, C и других файлов (кода).

Возможно, вы не используете все эти инструменты, но лучше иметь их под рукой "на всякий случай" и знать, как ими пользоваться, даже на базовом уровне. Но если вы решили использовать другой язык, то инструменты в основном зависят от вас, и, возможно, приведенный выше список просто не поможет вам. Ниже приведена информация, в основном относящаяся к разработчикам C/C++ или Assembler.

# GNU/Linux

Наиболее рекомендуемой системой для разработки ОС является GNU/Linux. При использовании GNU/Linux большинство инструментов разработки GNU, вероятно, уже присутствуют. Если нет, используйте инструменты управления пакетами вашего дистрибутива (APT, RPM, Portage, Pacman, Apk и т.д.), чтобы установить их по мере необходимости. Опять же, требуется настроить кросс-компилятор,.

Распространенными редакторами являются Vim (opens new window), Emacs (opens new window), KDevelop (opens new window), Komodo Edit (opens new window) и т.д. Некоторые предпочитают легкие редакторы вместо IDE, такие как gedit (opens new window), Geany (opens new window) и SciTE (opens new window). Многим нравится Midnight Commander (opens new window), который имеет текстовый пользовательский интерфейс и встроенный редактор (mcedit) и, следовательно, чрезвычайно легкий и быстрый.

# Windows

Для того, чтобы получить необходимые инструменты, вы должны установить среду Cygwin (opens new window). MinGW (opens new window) или DJGPP (opens new window) являются альтернативами, но MSYS2 (opens new window) настоятельно рекомендуется, поскольку это наиболее полная и совместимая среда, а также включает в себя менеджер пакетов для установки библиотек и инструментов.

Microsoft недавно (на момент написания статьи) выпустила подсистему Windows для Linux в качестве дополнительной функции для Windows 10. Это дистрибутив Ubuntu, работающий поверх Windows БЕЗ использования виртуальной машины. Последние версии GCC и Binutils (6.1.0 и 2.27 на момент написания) компилируются и корректно работают в этой среде. Используя оболочку Bash, вы можете получить доступ к жестким дискам Windows через /mnt/<буква диска>. Преимущество этого решения заключается в том, что вы можете работать с любыми необходимыми инструментами Windows или Linux, не выясняя, работают ли они в Cygwin (opens new window). Многие необходимые инструменты можно установить с помощью "apt-get".

На забудьте настроить кросс-компилятор GCC 😃

Вам также понадобится редактор. Вы можете использовать обычный блокнот, но будет проще если у вас есть более полный редактор. Например, Notepad++ (opens new window) или Notepad2 (opens new window) используются многими людьми. Если вам удобно работать с редакторами Unix, вы можете выбрать один из вариантов, предоставляемых Cygwin (opens new window) (который включает, например, Vim (opens new window) и Emacs (opens new window), которые требуют некоторого привыкания, но очень мощные).

Также можно использовать Visual Studio или свободно загружаемую версию Visual C++ Express Edition для написания и компиляции операционной системы. Вы даже можете установить Windows SDK сверху, включив 64-разрядную разработку. Единственная загвоздка в том, что этот вариант не будет поддерживать Inline Assembly.

# macOS

Поскольку под капотом он использует FreeBSD, он полностью совместим с POSIX. Доступны все обычные инструменты (vi, bash, dd, cat, sed, tar, cpio и т.д.) почти каждый туториал будет работать "из коробки". Отсутствующие инструменты в основном связаны с файловой системой: ни устройства обратной связи, ни fdisk, ни mkfs.vfat, ни mtools. Но вы можете использовать diskutil для этих целей или использовать brew или macports для установки отсутствующих инструментов.

Пользователи macOS 10.13 и выше могут установить XCode Command Line Tools (не IDE, а только набор инструментов), запустив "xcode-select --install" из терминала. Это позволит установить gcc, binutils и make.

# Тестирование операционной системы

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