Маленькая ОС с нуля на C++ и ассемблере

Сразу говорю, не закрывайте статью с мыслями «Блин, еще один Попов». У него всего-то слизанная Ubuntu, а у меня все с нуля, включая ядро и приложения. Итак, продолжение под катом.

Группа ОС: вот.
Сначала я кину вам один скриншот.



Больше их нет, а теперь поподробнее о том, зачем я ее пишу.

Был теплый апрельский вечер, четверг. Я еще с детства мечтал написать ОС, как вдруг подумал: «Я же теперь знаю плюсы и асм, чего бы не воплотить мою мечту?». Загуглил сайты по этой тематике и нашел статью с Хабра: "Как начать и не бросить писать ОС". Спасибо ее автору за ссылку на OSDev Wiki внизу. Я зашел туда и начал работу. Там были в одной статье все данные о минимальной ОС. Я начал собирать кросс-gcc и binutils, а потом все переписал оттуда. Видели вы бы мою радость, когда я увидел надпись «Hello, kernel World!» Я прямо со стула подпрыгнул и понял — я не сдамся. Я написал «консоль» (в кавычках, у меня не было доступа к клавиатуре), но потом решил написать оконную систему. В итоге она заработала, но доступа к клавиатуре у меня не было. А потом я решил придумать название, опираясь на X Window System. Загуглил Y Window System — она есть. В итоге назвал Z Window System 0.1, входящая в OS365 pre-alpha 0.1. И да, ее не видел никто, кроме меня самого. Потом я понял, как реализовать поддержку клавиатуры. Скрин самой первой версии, когда еще не было ничего, даже оконной системы:



В ней даже не двигался курсор текста, как вы видите. Затем я написал парочку простых приложений на основе Z. И вот релиз 1.0.0 alpha. Там были много вещей, даже меню системы. А файловый менеджер и калькулятор просто не работали.



Далее 1.0.1 с текстовым редактором, 1.0.2 с граф. режимом 640x480, 1.0.3 с рабочим столом, 1.0.4 с русским языком, 1.0.5 с фиксами и чем-то еще, 1.0.6 с часами, а вот на 1.1 остановимся поподробнее.

Меня прямо терроризировал друг, которому важны одни красивости (Митрофан, сорри). Говорил «Запили VBE-режим 1024*768*32, запили, запили! Ну запили!». Ну я уже устал его выслушивать и все-таки запилил его. О реализации ниже.

Я сделал все моим загрузчиком, а именно GRUB'ом. С его помощью можно задать графический режим без осложнений путем добавления нескольких магических строчек в заголовок Multiboot.

.set ALIGN,	1<<0
.set MEMINFO,	1<<1
.set GRAPH,     1<<2
.set FLAGS,	ALIGN | MEMINFO | GRAPH
.set MAGIC,	0x1BADB002
.set CHECKSUM, 	-(MAGIC + FLAGS)
.align 4
.long MAGIC
.long FLAGS
.long CHECKSUM
.long 0, 0, 0, 0, 0
.long 0 # 0 = set graphics mode
.long 1024, 768, 32 # Width, height, depth

А потом из структуры информации Multiboot я беру адрес фреймбуфера и разрешение экрана и пишу туда пиксели. VESA все сделали очень замороченно — цвета RGB надо вводить в обратном порядке (не R G B, а B G R). Я несколько дней не понимал — почему пиксели не выводятся!? В итоге я понял, что забыл поменять значения 16 цветовых констант с 0...15 на их RGB-эквиваленты. В итоге релизнул, заодно запилил градиентный фон. Потом я сделал консоль, 2 приложения и релизнул 1.2. Ах да, чуть не забыл — скачать ОС можно на сайте (хабраэффект, он лежит).
И да, вы не поверите, но мне 11 лет.
Продолжение следует…

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 42

    +37
    Как-то ни о чём. Скриншоты — ну ок, что-то работает и что-то написали. Так многие в своё время свою хело-ворлд-ось писали или пытались. Это классная тема для обучения и for fun, но смысл описывать результаты в виде картинок gui, хоть бы вкратце техническую часть описали. Гуй это, наверно, самое простое для реализации и самое неинтересное для интересующихся во всей оси.
      +1
      Действительно. Надо бы во 2 части все сделать это.
      0
      Мыши нет, из окна автора выйти в принципе невозможно… А так прикольно. Хотя, как выше сказали, ни о чём.
        0
        Я знаю, писал просто так. Выйти из авторов — X.
        0
        Еще бы браузер ей. Ну и поддержку http, конечно…
          0
          Будет ;-)
            0
            Линукс когда пилили, тоже были оптимистичны с поддержкой tcp… осторожнее в обещаниях =)
          +5
          Это очень похвально, сам когда-то начинал писать ОС и бросил. Но лучше ваш энтузиазм направить в развитие того же linux — там разработчики лишними не бывают. А по поводу самой статьи, то хочется больше технических подробностей: реализация управления памятью, IPC и прочих вещей.
            +1
            У меня нет IPC. А управление памятью очень тупое, просто с конца ядра malloc выделяет память. UPD: точнее, нет процессов вообще. Короче, моя ОС очень недоделанная.
            +3
            Больше мяса надо в статье, какие-то технические проблемы с какмим сталкивался, как их решал.
            Нужно более структурированно рассказать какие ставились цели, какие достигнуты, какие нет, какие есть планы.
            А так сам всегда хотел в целях самообразования что-то подобное написать.
            Всегда рад почитать что кто-то взялся и сделал :)
              0
              Будет продолжение. Оно будет более техническое.
              +1
              Молодцы, хорошо начали, удачи!!! Буду следить)
                0
                Рад, что мои труды ценят :-)
                +3
                Как хобби just for fun все круто. Но я смотрю вы серьезно все это воспринимаете, сообщество «Byte PowerSoft — Official», «Enjoy using our services» и тд. В таком случае мне ваша затея вообще не понятна.
                  +4
                  Судя по ВК, авторам лет по 13-14.
                  Я тоже в 13-14 пытался написать свою ОС, но не смог, а тут смогли. Крутота.
                    –4
                    Я просто очень упорный.
                    +1
                    Как говорил один из моих преподавателей: каждый порядочный программист когда-то берётся за написание ОС. Как бы ни было, результаты только не «выкидывайте»
                      +1
                      Я начал собирать кросс-gcc и binutils

                      +#if defined(__linux__)
                      +#error "Compiling is not allowed without the cross-compiler"
                      +#endif
                      

                      А зачем вам там кросс-компилятор?
                        0
                        Обычный сует свою стандартную библиотеку куда попало.
                          +1
                          1) Что плохого встретилось в стандартной библиотеке?
                          2) Есть ключи для того, чтобы он этого не делал: -nostdinc для путей поиска #include, -nodefaultlibs, -nostdlib для библиотек. Можно линковать командой ld вместо gcc.

                          Ядро linux, например, вполне собирается обычным компилятором.
                            0
                            1) ОС не загрузится. Пробовал.
                            2) Точно, позабыл как-то.
                            3) Ядро линукса собирается i386-pc-linux-gnu-gcc, а его алиас — gcc.
                              +1
                              1) ОС не загрузится. Пробовал.
                              Почему не загружается то? Статически линковали?
                            0
                            Обычный сует свою стандартную библиотеку куда попало.
                            -nostdlib

                            upd опоздал
                          0
                          Завидую людям с такой усидчивостью, способных работать без особой мотивации.

                          p.s. неполенитесь, попробуйте поиграться с ARM железом и своей OS там… что то мне говорит что вы можете найти необычный фидбек и поддержку.
                            0
                            Пару лет назад, ради интереса в свободное время, писал программную реализацию 8086, не довел до конца.
                            Было бы весело запустить на своем программном PC свою ОС :)
                              +1
                              Я тоже писал, лет пять назад. Тот эмулятор вот только такие самодельные ОС и мог запускать, не более. Сделал реализацию 8186, понаделал кучу тестов, сравнивал работу с bochs, в итоге все уперлось в реализацию биоса. Документации по набору команд *86, хоть отбавляй, взять даже тот трехтомник intel по IA32. А вот подробной документации по функциям биоса уже не так много. Можно конечно было слизать с bochs, я тогда зеленый был, и меня пугал его код.
                              Помню как все пытался запустить MS DOS 6.22. Я тогда первичный загрузчик вдоль и поперек продебажил. Первичный загрузчик отрабатывал нормально, загружал вторичный, который грузил какие-то большие файлы с диска, а затем вдруг начиналось дерганье всех подряд функций биоса. Большую часть я кое как реализовал, но были некоторые вызовы, про которые я документацию так и не нашел. В итоге система зависала, помучавшись пару недель, я бросил это неблагодарное занятие. До сих пор удивляюсь, как у меня терпения хватило столько намучаться.
                              Вот эта штука на удивление нормально работала: www.codenet.ru/progr/os/

                              Скрин, если кому любопытно

                                0
                                Есть бинарник? Хочу протестить.
                                +1
                                Раз поднялась такая тема, тоже расскажу свою историю. На диплом делал эмулятор процессора, по документации IA32. Цель была сделать простую виртуальную машину, но при этом оставить полный доступ к оборудованию с возможностью эмулировать отдельные устройства типа CD-ROM. В основном, для ситуаций вида «скинул образ ОС на флешку, подключил виртуальный CD-ROM, поставил ОС на комп». Сначала думал — подумаешь, несколько сотен мелких команд процессора эмулировать, за год управлюсь. Я явно переоценил свои возможности, оказалось, что придумали много всяких умных штук типа DMA и GDT. Поэтому для демонстрации пришлось также написать маленькую ОС в которой использовались только простые команды, но был графический режим, драйвер клавиатуры и браузер содержимого CD. Зато 16-разрядные команды и прерывания эмулировались полностью, и можно было сделать виртуальную дискету из образа.

                                Скрытый текст
                                Дело осложнялось тем, что при любой ошибке в защищенном режиме процессор уходит в перезагрузку. Поэтому сделал систему логов, работала она так — программа пишет строки в память начиная с некоторого константного адреса, при ошибке происходит перезагрузка, при горячей перезагрузке память не обнуляется, загружается DOS, из него можно запустить специальную программу, которая из реального режима открывает доступ к 4Г памяти, читает с этого адреса строки, выводит их на экран через досовское прерывание, а при запуске можно перенаправить этот вывод в файл. Может кому пригодится такой способ.
                                0
                                То чувство, когда ты пытался в свое время, но не хватило терпения, а кто-то взял и сделал.

                                Ну, а вообще красава конечно. Допили до чего-то внятного и вот тебе портфолио на работу устраиваться или в институт проще поступить — я из комментариев понял, что молодежь. В любом случае респект.
                                  0
                                  ПС. ссылка не работает
                                    0
                                    Какая?
                                      0
                                      Ах да, чуть не забыл — скачать ОС можно на сайте (хабраэффект, он лежит).


                                      Вот эта в конце статьи. Выдает какой то текст (не успел прочесть) и редиректит потом.
                                        0
                                        Я же говорил, что хабраэффект.
                                          0
                                          Печально когда хостер так подводит. А на каких показателях посещаемости такое произошло? просто интересно что дал хабраэффект.
                                            0
                                            Не смотрел. Но в группе подписчики в 2.5 раза выросли.
                                    0
                                    Спасибо. Насчет портфолио согласен.
                                    0
                                    Название статьи звучит потрясающе)
                                      0
                                      Обновил статью.
                                        0
                                        Вы не поверите. Мне 11 лет.
                                          0
                                          11 лет? Отличный возраст, чтобы начать участвовать в разработке linux, как ранее рекомендовал rutaka_n!

                                          Как показала практика, можно открыть счёт своих linux'овых commit'ов и в более юном возрасте.
                                          Вот, к примеру, в linux взяли commit, автором которого числится девочка четырёх лет:

                                        0
                                        Файла нет. Обновите пж ссылку или перезалейте на гитхаб. Можете кинуть в комментарии?

                                        Only users with full accounts can post comments. Log in, please.