Предыстория
Умные люди в умных книгах говорят о необходимости качественно структурировать код. Я вполне с ними согласен. В моей работе я часто встречаю примеры отвратительного кода. Более того, сам, бывает, использую «говнокодирование». Это, плохо. Плохой код затрудняет чтение, исправление и развитие. Обнаружив такие места я стараюсь исправить эти участки. Поэтому нужна новая, более понятная, структура проекта. В связи с этим, я начал искать, а есть ли какие-либо примеры, как надо структурировать исходный код? И нашел! На сайте OS DEV есть отдельная статья о структурировании кода — Meaty Skeleton. Но обо всем по порядку.
Linux
Сначала я заглянул в код Linux. Там очень много папок и файлов. В этом многообразии прослеживается определенная структура. Есть папка для подключаемых заголовков — include, папки самого ядра (kernel). А также папки с кодом привязанным к определенной архитектуре компьютера: arch.
Естественно кодовая база в текущем ядре Linux колоссальная. На июль 2017 года в ядре было 24.1 млн. строк. Поэтому мне было очень трудно прикинуть структуру на текущий момент. Старший брат оказался слишком огромным.
А каким Линукс был на старте? Нехитрые поисковые запросы привели меня в форк Линукса версии 1.0.0. В этой версии всего было гораздо меньше. Однако некоторые папки были такие же. Не было отдельной папки для архитектурно зависимого кода.
Структура проекта в Meaty Skeleton
В статье про скелет ОС есть отдельный абзац в котором написано:
Это руководство задумано как минимальный рабочий пример. Быстрое создание ОС Hello World для нетерпеливых новичков.
Bare Bones::Meaty Skeleton
Там же была ссылка на статью. Структура этого примера частично повторяла структуры просмотренных мною в репозиториях Linux.
Структура моего проекта
Изучив все примеры, я решил принять следующую структуру проекта. На верхний уровень добавить папки:
- boot — для кода загрузочного сектора
- include — файлы заголовков (пока без вложенных папок)
- drivers — папка для базовых драйверов
- kernel — код ядра (позже здесь будут находиться реализации системных вызовов)
- lib — реализация вспомогательных функций
В связи с изменением структуры мне потребовалось изменить все имеющиеся Makefile и добавить требуемые. Результаты этих изменений можно посмотреть в репозитории. Напомню про то, что имя репозитория изменилось, так как была переименована сама ОС: EOS
Посмотрите еще мою статью о рефакторинге в коде ядра — Работа над ошибками, работа над собой. Она будет иметь продолжение!
Картинки найдены на просторах интернета.