Предыстория

Умные люди в умных книгах говорят о необходимости качественно структурировать код. Я вполне с ними согласен. В моей работе я часто встречаю примеры отвратительного кода. Более того, сам, бывает, использую «говнокодирование». Это, плохо. Плохой код затрудняет чтение, исправление и развитие. Обнаружив такие места я стараюсь исправить эти участки. Поэтому нужна новая, более понятная, структура проекта. В связи с этим, я начал искать, а есть ли какие-либо примеры, как надо структурировать исходный код? И нашел! На сайте OS DEV есть отдельная статья о структурировании кода — Meaty Skeleton. Но обо всем по порядку.

Linux

Linux

Сначала я заглянул в код Linux. Там очень много папок и файлов. В этом многообразии прослеживается определенная структура. Есть папка для подключаемых заголовков — include, папки самого ядра (kernel). А также папки с кодом привязанным к определенной архитектуре компьютера: arch.

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

А каким Линукс был на старте? Нехитрые поисковые запросы привели меня в форк Линукса версии 1.0.0. В этой версии всего было гораздо меньше. Однако некоторые папки были такие же. Не было отдельной папки для архитектурно зависимого кода.

Структура проекта в Meaty Skeleton

структура проекта в Meaty Skeleton

В статье про скелет ОС есть отдельный абзац в котором написано:

Это руководство задумано как минимальный рабочий пример. Быстрое создание ОС Hello World для нетерпеливых новичков.

Bare Bones::Meaty Skeleton

Там же была ссылка на статью. Структура этого примера частично повторяла структуры просмотренных мною в репозиториях Linux.

Структура моего проекта

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

  • boot — для кода загрузочного сектора
  • include — файлы заголовков (пока без вложенных папок)
  • drivers — папка для базовых драйверов
  • kernel — код ядра (позже здесь будут находиться реализации системных вызовов)
  • lib — реализация вспомогательных функций

В связи с изменением структуры мне потребовалось изменить все имеющиеся Makefile и добавить требуемые. Результаты этих изменений можно посмотреть в репозитории. Напомню про то, что имя репозитория изменилось, так как была переименована сама ОС: EOS

Посмотрите еще мою статью о рефакторинге в коде ядра — Работа над ошибками, работа над собой. Она будет иметь продолжение!

Статья на Дзене

Картинки найдены на просторах интернета.