ulteam8

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

ПрактикаRusFjord

Предыстория

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

Linux

linux.jpg

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

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

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

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

skull-1515874_1280.jpg

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

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

— Bare Bones::Meaty Skeleton

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

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

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

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

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

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

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

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

Комментарии

Комментариев пока нет

Войдите, чтобы оставить комментарий