Как стать автором
Обновить

Комментарии 34

Классно, что кто-то ещё пишет ОС. Но такого полным полно, море примеров. Круто делать это сразу на си и в защищённом режиме, используя 32 бита, не используя вызовы BIOS и написать такую статью.

Спасибо большое за комментарий. Учту ваше предложение

Да, UEFI интереснее. Но и у BIOS есть приколюхи - есть множество плохо-документированных прерываний для возможности реализации всяких прикольных штук)

Если уж лезть в BIOS (о каком BIOS, кстати мы говорим?), то в ISA видеокартах есть свои приколюхи. Но там даже интереснее читать документацию на камень. Я с одной видяхой долгой проковырялся, пытаясь понять как заставить её работать в режиме VGA с внешним LCD-экраном. Да, были видяхи сразу для LCD.

Я, чтобы не быть голословным, автору посоветую глянуть мои публикации по теме:

Пишем свой ROM BIOS

Разработка BIOS на языках высокого уровня

Разница между своим BIOS и операцинке с дискетки не сильно большая (только в стартовом адресе). Ну и особенностях инициализации: ROM может быть исполнено непосредственно в области памяти, либо скопирована и исполнена (много крови попила эта особенность).

Спасибо вам большое за материал. С радостью прочту ваши статьи)

Хорошо написана статья, качественно.

Спасибо большое

Статья хорошая. Только странно видеть 16-битная операционная система для архитектуры Intel x86_64. Ведь этот режим остался в наследство от куда более ранних архитектур. Интересно почему автор решил писать полностью на ассемблере не переходя на С/C++/Rust или это только для первой статьи и переход в планах? Сам в свободное время изучаю осестроение, благо щас много открытых источников правдо на английском и конечно open source. Даже пытаюсь начать записывать свои эксперименты на бусти. Очень желаю автору удачи в этом деле!

Спасибо большое за комментарий. На раннем этапе разработки, писать на ассемблере не трудно, прерывания BIOS делают большую часть работы за программиста.
Операционная система содержит свой загрузчик, в случае если бы ОС писалась сразу на C, то пришлось бы использовать GRUB. Я не хотел использовать какой либо другой загрузчик, из-за того, что упускается возможность на практике понять как происходит загрузка ОС. А так же, GRUB переводит процессор в защищённый режим, что не даст практического понимания структуры таблицы дескрипторов, необходимой для перехода в защищённый режим и выше.
В будущем очень хочу всё таки перейти в защищённый режим, поиграться с long mode и подрежимами для 2 режимов и если получится, пощупать SMM. После перехода в защищённый режим, уже можно будет вызывать C из ASM кода.
Так же ОС не хватает файловой системы, очень хотелось бы разобраться в этом вопросе.

Для файловой системы нужно сначало написать драйвер диска. Самым простым будет ATA-PIO driver(https://wiki.osdev.org/ATA_PIO_Mode). А файловая система самая простая будет FAT12 или FAT16. У меня в репозитории можно посмотреть реализацию файловой системы и драйвера диска: https://github.com/JustVic/melisa_kernel или https://app.radicle.xyz/nodes/seed.radicle.garden/rad:z41oQJssJbL5T2So5n78ggcqX68Xt. Я не очень умный программист, потому у меня всё как можно проще, из грязи палок :). Не сочтите за рекламу, первоночально я начинал по курсу : https://www.udemy.com/course/writing-your-own-operating-system-from-scratch/, (я никак не связан с автором курса) если вдруг повезёт где-то бесплатно или дёшего получить к нему доступ, то неплохой старт, там загружаются в 64-bit(Long mode) до файловой системы доходят, но там нету драйвера диска, там как-то схитрили. Но там все видео с защитой DRM, скачать неполучается. В курсе используется NASM и пишут свой загрузчик.

Но перед драйвером диска и файловой системы конечно разумно дойти до Long Mode.

Чтобы загрузится в Long mode из Protected примерно нужно выполнить следующее( по крайней мере я делал примерно так, после загрузки Grub2 правда):

Чтобы проверить присутствие 64-бит(long mode) нужно проверить присутствие иструкции cpuid. Потом использовать её для проверкии Long mode.
Потом включить Paging. Сначало разобравшись как он работает.
Потом загрузить GDT. Тоже разобравшись как она работает.
Тут неплохо написано: https://os.phil-opp.com/entering-longmode/
Ну и конечно на osdev.org смотреть там тоже много всего.

Спасибо вам большое. Ваша помощь не оценима. Обязательно прочту

А всё, что есть на Хабре по этой теме, вы уже прочитали?

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

В принципе, аналогичная программа, это не ОСь, может быть и на uefi. И также запускается без grub. Здесь, на хабре, есть примеры. Там можно писать на С, с привязкой функций на uefi вместо прерываний биос.

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

Зы.

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

  1. Не останавливайся, развивайся, хорошо пишешь.

Жаль, что переходят полностью на UEFI, мне кажется он слишком перегружен ненужными функциями, из-за чего могут возникать вопросы например с безопастностью. Под UEFI даже IRC-клиенты пишут https://github.com/codyd51/uefirc. Интересно как будет работать GRUB2 и загрузка с ним на таких платах без legacy режима.

возможно в начале стоит сделать оговорку что в случае uefi нас может ждать совсем другая история. Случайный человек конечно вряд ли будет все это читать и пробовать, но тем не менее, зачем неоднозначность ..

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

Как раз хотел прокомментировать на эту тему. Выпускайте поскорее сетевой драйвер с tcp/ip библиотекой, делайте управление памятью и хватит. А то все на фс и графике заморачиваться, а до главного руки не доходят. Кстати загрузку с уефи тоже стоит добавить, хотя бы как опцию.

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

Спасибо вам большое за оставленный комментарий. На момент написания этой ОС, я понимал что у меня не получится в одиночку довести её до "Повседневной ОС". А как среда исполнения кода вполне себе. Наплодить Docker нодов и разворачивать микросервисы на них. Спасибо вам большое, как будет получаться, обязательно напишу об этом статью.

Моя идея была запускать вашу ОС вместо докер контейнера. Но если хотите посерьёзнее, то да, добавьте возможность запустить несколько контейнеров в общем / изолированном окружении. Да, когда закончите POC, сравните с TinyCore и Openwrt по функционалу и размеру. Чтобы понять, нужна ли она...

Вот бы Вы "что бы" слитно писали...

Сколько уже таких систем (по факту загрузчиков) было сделано? Понятно, что написать загрузчик прикольно, но до ОС еще очень далеко. Почему кстати выбрана именно 16-битная система и именно для x86 (а не 64-битная для ARM, например - всяко ж современнее и интереснее, разве нет)? И зачем всю систему писать на ассемблере?

Ждем следующих статей про основы собственно ОС, например про распределение ресурсов (процессора, памяти, времени и т.д.): как сделать скоростной планировщик, аллокатор памяти, как работать со временем или просто сделать банальное DPC/APC. Или вам больше интересна работа с железом на низком уровне?

Спасибо вам большое за комментарий. 16-битная операционная система из-за того, это мой первый опыт низкоуровневой разработки. Переход в защищённый или x64 режим, убьёт возможность вызывать прерывания BIOS. Я пока что понимаю, как работать с периферией или ATA интерфейсом в теории, набираюсь практического опыта. Помимо этого, у меня ещё не получалось выйти в защищённый режим, пока что читаю документацию.

Переход в защищённый или x64 режим, убьёт возможность вызывать прерывания BIOS

Не убьет, просто это будет немного сложнее. Посмотрите исходники почти любого dos-extender'а, или dpmi-сервера, там именно это и реализовано: вызов прерываний из защищенного режима.

работать с периферией или ATA интерфейсом в теории

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

real mode и прерывания BIOS - это скучно и банально. Такое студенты на первом курсе пишут. Сейчас было бы более актуально x86_64 и UEFI, а также работа с современным железом - PCI-express, USB, загрузка с флэшек и по сети. Такую статью я бы почитал с удовольствием.

Мне тоже интересно было бы почитать про USB, PCI-express или загрузку с флешек по сети, с этим полностью согласен.

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

А почему вы решили что это есть операционная система?

На основании того, что оно запускается биосом и выводит приглашение CLI?

Спасибо за комментарий. Понимаю, что мой код не является законченной операционной системой. Это больше попытка реализации простого и понятного кода

НЛО прилетело и опубликовало эту надпись здесь

Спасибо вам большое за комментарий. Да, продолжение будет. Сейчас как раз разбираю таблицу GDT

0x0a - Перевод каретки в начало строки.

0x0d - Перевод строки.

Наоборот:

CR=13=0xD - возврат каретки (в начало строки).

LF=10=0xA - перевод строки, переход к следующей строке.

Спасибо за замечание, исправлю

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации