Пишем свою ОС: Выпуск 1

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

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

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

    Мы будем предполагать, что читатель уже знаком с основами языков ассемблер и Си, а также элементарными понятиями архитектуры ЭВМ. То есть, мы не будем объяснять, что такое регистр или, скажем, оперативная память. Если вам не будет хватать знаний, вы всегда можете обратиться к дополнительной литературе. Краткий список литературы и ссылки на сайты с хорошими статьями есть в конце статьи. Также желательно уметь пользоваться Linux, так как все инструкции по компиляции будут приводиться именно для этой системы.

    А теперь — ближе к делу. В оставшейся части статьи мы с вами напишем классическую программу «Hello World». Наш хеллоуворлд получится немного специфическим. Он будет запускаться не из какой-либо операционной системы, а напрямую, так сказать «на голом железе». Перед тем, как приступить непосредственно к написанию кода, давайте разберёмся, как же конкретно мы пытаемся это сделать. А для этого надо рассмотреть процесс загрузки компьютера.

    Итак, берем свой любимый компьютер и нажимаем самую большую кнопочку на системном блоке. Видим веселую заставку, системный блок радостно пищит спикером и через какое-то время загружается операционная система. Как вы понимаете, операционная система хранится на жёстком диске, и вот тут возникает вопрос: а каким же волшебным образом операционная система загрузилась в ОЗУ и начала выполняться?

    Знайте же: за это отвечает система, которая есть на любом компьютере, и имя ей — нет, не Windows, типун вам на язык — называется она BIOS. Расшифровывается ее название как Basic Input-Output System, то есть базовая система ввода-вывода. Находится BIOS на маленькой микросхемке на материнской плате и запускается сразу после нажатия большой кнопки ВКЛ. У BIOS три главных задачи:
    1. Обнаружить все подключенные устройства (процессор, клавиатуру, монитор, оперативную память, видеокарту, голову, руки, крылья, ноги и хвосты…) и проверить их на работоспособность. Отвечает за это программа POST (Power On Self Test – самотестирование при нажатии ВКЛ). Если жизненно важное железо не обнаружено, то никакой софт помочь не сможет, и на этом месте системный динамик пропищит что-нибудь зловещее и до ОС дело вообще не дойдет. Не будем о печальном, предположим, что у нас есть полностью рабочий компьютер, возрадуемся и перейдем к рассмотрению второй функции BIOS:
    2. Предоставление операционной системе базового набора функций для работы с железом. Например, через функции BIOS можно вывести текст на экране или считать данные с клавиатуры. Потому она и называется базовой системой ввода-вывода. Обычно операционная система получает доступ к этим функциям посредством прерываний.
    3. Запуск загрузчика операционной системы. При этом, как правило, считывается загрузочный сектор — первый сектор носителя информации (дискета, жесткий диск, компакт-диск, флэшка). Порядок опроса носителей можно задать в BIOS SETUP. В загрузочном секторе содержится программа, иногда называемая первичным загрузчиком. Грубо говоря, задача загрузчика — начать запуск операционной системы. Процесс загрузки операционной системы может быть весьма специфичен и сильно зависит от её особенностей. Поэтому первичный загрузчик пишется непосредственно разработчиками ОС и при установке записывается в загрузочный сектор. В момент запуска загрузчика процессор находится в реальном режиме.

    Печальная новость: размер начального загрузчика должен быть всего 512 байт. Почему так мало? Для этого нам надо ознакомиться с устройством дискеты. Вот познавательная картинка:

    На картинке изображена поверхность дискового накопителя. У дискеты 2 поверхности. На каждой поверхности есть кольцеобразные дорожки (треки). Каждый трек делится на маленькие дугообразные кусочки, называемые секторами. Так вот, исторически сложилось, что сектор дискеты имеет размер 512 байт. Самый первый сектор на диске, загрузочный сектор, читается BIOS'ом в нулевой сегмент памяти по смещению 0x7С00, и дальше по этому адресу передается управление. Начальный загрузчик обычно загружает в память не саму ОС, а другую программу-загрузчик, хранящуюся на диске, но по каким-то причинам (скорее всего, эта причина — размер) не влезающую в один сектор. А поскольку пока что роль нашей ОС выполняет банальный хеллоуворлд, наша главная цель — заставить компьютер поверить в существование нашей ОС, пусть даже и на одном секторе, и запустить её.

    Как устроен загрузочный сектор? На PC единственное требование к загрузочному сектору — это содержание в двух его последних байтах значений 0x55 и 0xAA — сигнатуры загрузочного сектора. Итак, уже более-менее понятно, что нам нужно делать. Давайте же писать код! Приведённый код написан для ассемблера yasm.
         section .text<br/>
         use16<br/>
         org  0x7C00  ; наша программа загружается по адресу 0x7C00<br/>
    start:<br/>
         mov  ax, cs<br/>
         mov  ds, ax ; выбираем сегмент данных<br/>
     <br/>
         mov  si, message<br/>
    cld ; направление для строковых команд<br/>
         mov  ah, 0x0E  ; номер функции BIOS<br/>
         mov  bh, 0x00 ; страница видеопамяти<br/>
    puts_loop:<br/>
         lodsb ; загружаем очередной символ в al<br/>
         test al, al ; нулевой символ означает конец строки<br/>
         jz   puts_loop_exit<br/>
         int  0x10 ; вызываем функцию BIOS<br/>
         jmp  puts_loop<br/>
    puts_loop_exit:<br/>
         jmp  $ ; вечный цикл<br/>
     <br/>
    message:<br/>
         db   'Hello World!',0<br/>
    finish:<br/>
         times 0x1FE-finish+start db 0<br/>
         db   0x55, 0xAA ; сигнатура загрузочного сектора

    Эта короткая программа требует ряда важных пояснений. Строка org 0x7C00 нужна для того, чтобы ассемблер (имеется в виду программа, а не язык) правильно рассчитал адреса для меток и переменных (puts_loop, puts_loop_exit, message). Вот мы ему и сообщаем, что программа будет загружена в память по адресу 0x7C00.
    В строках
        mov         ax, cs<br/>
        mov         ds, ax
    происходит установка сегмента данных (ds) равным сегменту кода (cs), поскольку в нашей программе и данные, и код хранятся в одном сегменте.

    Далее в цикле посимвольно выводится сообщение «Hello World!». Для этого используется функция 0x0E прерывания 0x10. Она имеет следующие параметры:
    AH = 0x0E (номер функции)
    BH = номер видеостраницы (пока не заморачиваемся, указываем 0)
    AL = ASCII-код символа

    В строке «jmp $» программа зависает. И правильно, незачем ей выполнять лишний код. Однако чтобы компьютер опять заработал, придется перезагрузиться.

    В строке «times 0x1FE-finish+start db 0» производится заполнение остатка кода программы (за исключением последних двух байт) нулями. Делается это для того, чтобы после компиляции в последних двух байтах программы оказалась сигнатура загрузочного сектора.

    С кодом программы вроде разобрались, давайте теперь попробуем скомпилировать это счастье. Для компиляции нам понадобится, собственно говоря, ассемблер — выше упомянутый yasm. Он есть в большинстве репозиториев Linux. Программу можно откомпилировать следующим образом:
    $ yasm -f bin -o hello.bin hello.asm
    Полученный файл hello.bin нужно записать в зарузочный сектор дискеты. Делается это примерно так (разумеется, вместо fd нужно подставить имя своего дисковода).
    $ dd if=hello.bin of=/dev/fd
    Поскольку далеко не у всех остались дисководы и дискеты, можно воспользоваться виртуальной машиной, например, qemu или VirtualBox. Для этого придётся сделать образ дискеты с нашим загрузчиком и вставить его в «виртуальный дисковод».
    Создаём образ диска и заполняем его нулями:
    $ dd if=/dev/zero of=disk.img bs=1024 count=1440
    Записываем в самое начало образа нашу программу:
    $ dd if=hello.bin of=disk.img conv=notrunc
    Запускаем полученный образ в qemu:
    $ qemu -fda disk.img -boot a
    После запуска вы должны увидеть окошко qemu с радостной строчкой «Hello World!». На этом первая статья заканчивается. Будем рады увидеть ваши отзывы и пожелания.

    Литература
    1. По языку ассемблера:
    2. По языку Си:
      • Керниган Б., Ритчи Д. «Язык программирования C»
      • Шилдт Г. «Полный справочник по C»
    3. По устройству операционных систем:
      • Таненбаум Э. «Современные операционные системы»
      • Таненбаум Э. «Операционные системы: Разработка и реализация»
      • Олифер В., Олифер Н. «Сетевые операционные системы»
      • http://osdev.org
    4. По архитектуре ЭВМ:
      • Таненбаум Э. «Архитектура компьютера»
      • Гук М. «Аппаратные средства IBM PC. Энциклопедия»
      • Петцольд Ч. «Код. Тайный язык информатики»
    5. Справочная информация
    Поделиться публикацией

    Похожие публикации

    Комментарии 223
      +4
      Интересная задумка, буду следить :)

      А ОС 16-бит будет?
        +4
        Первые шаги точно будем делать в реальном режиме. А дальше хотелось бы перейти к 32-битам и защищённому.
          +4
          а тяжело перейти на 64? просто интересно
            0
            Про 64 мы пока не думали. Подумаем :)
              0
              буду ждать продолжения
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Надеюсь, Чип и Дейл быстро примут меры.
        –73
        А она принципиально новая?
        • НЛО прилетело и опубликовало эту надпись здесь
            0
            покажи
              +2
                0
                Надо же, уже своя рабочая ось в школе, молодец парень! Ему небось нравилась девочка по имени Вика? :)
                  +4
                  Нет, у меня тогда не было знакомых по имени Вика. Просто имя красивое :)
                    +1
                    победа же!
                      0
                      Ссылка мертва ((
          +52
          Суровый будет цикл статей
          Радует, что на хабре снова появились интересные авторские материалы.
          Сам никогда не буду писать свою ОС и вообще вряд ли буду программировать, но читать интересно, жду продолжения.
            +9
            Спасибо, будем стараться.
              +21
              хабр снова торт ;)
                +4
                торт is a lie!
                • НЛО прилетело и опубликовало эту надпись здесь
                    0
                    still alive :)
              +6
              Эх, такой замечательный вечер, стайки девушек на улице, хотел погулять, но тут Вы все обломали… придется писать :)
              Спасибо!
                –36
                (задумчиво) Какая ахинея…

                Нет, я не возражаю, что на некоторых компьютерах именно так. Но нафига в _основах_ работы операционных систем изучать устройство диска (которое ещё и не правда к тому же, где вы видели дорожки у рейда или SSD, цеплюящегося по SAS через экстендер?)

                Начинать нужно с другого. ЧТО должна делать ОС. Поскольку все современные ОС сильно… м… заняты всякой второстепенной ерундой, то либо mach, либо какой-нибудь гипервизор вроде xen'а. Там куда в более общем виде описано что происходит при включении компьютера и в чём состоит задача ОС.
                  +15
                  от простого — к сложному. майкрософт тоже не с вин7 и ссд начинал…
                    –9
                    Именно! А начиная с тонкостей реализации драйверов блочных устройств под специфичный вид BIOS'а специфичной платформы, получается очень сложно. Потому что вместо простого представления о драйвере блочного уровня, мы получаем простыню с несуществующими секторами.
                      +9
                      Изначально и была простыня, зато все очень просто и прозрачно. Потому в детском саду и начинают со счетных палочек а не с общей непонятной теории.

                      Авторы правильно сделали что начали с «Hello World!», а не с многозадачности и всякого там IO.
                        –9
                        А теперь вопрос: сколько раз приходится переучивать дитя, освоившее счёт на палочках до момента, когда это дитя освоит теорию вычетов или начнёт решать дифуры в частных производных?

                        Кстати, может показаться удивительным, но как раз счёт на палочках — это очень абстрактная система счёта с наглядной визуализацией свойств натуальных чисел.

                        А то, что вы делаете — это обучение ребёнка в детском саду считать на калькуляторе. Слишком много знаний о кнопочках «М», «С/СЕ» и слишком мало теории счёта.
                          +5
                          Переучиваться придется всегда. Сначала нужно давать материал так, чтобы это было интересно, а уже потом — систематизировать его, потому что таблицы и справочники не прививают интереса к изучаемому предмету, а без него никуда
                            0
                            От простого — к сложному!
                            Врачей тоже не сразу учат операцию на мозг делать.
                      +9
                      Как мы уже писали в тексте статьи, мы не стараемся дать исчерпывающие теоретические данные, это не наша основная цель. Мы же хотим показать непосредственно процесс разработки и дать читателю самому поучаствовать. А о том, какие общие задачи решает ОС, написано много хороших книг (некоторые мы перечислили в конце статьи).
                        –10
                        Невозможно описать работу ОС просто без теории. С теорией — просто. Можно набросать минимальную ОС с минимальным функционалом, но реализующую, например, многозадачность и управление памятью. А вот набросать простенькую ОС, которая умеет делать diskIO и сама себя умеет загружать — нет. Она не будет простенькой, и уж тем паче, по ней трудно будет понять что зачем.
                          +6
                          Возможно, вы правы, и теории надо уделять больше внимания. Мы постараемся учесть это в следующих выпусках.
                        +6
                        Про дисковод тут написано для того, чтобы было понятно почему именно 512 байт. Дорожки и сектора сейчас виртуальные и эмулируются для совместимости и единообразия.

                        Начало цикла статей очень хорошее, все очень хорошо понятно, да еще можно самому попробовать не отходя от кассы.
                        • НЛО прилетело и опубликовало эту надпись здесь
                            +2
                            Ну, критиковать и писать своё — это две большие разницы. Если бы я мог с высоты птичьего полёта обсуждать ядро линукса, то у меня бы зарплата на нолик больше была.

                            Впрочем, я как раз сейчас внутренними потрохами зена занимаюсь, возможно, по совокупности можно будет сделать обзор. А из литературы рекомендую Prentice Hall — The Defenitive Guide to the Xen Hypervisor. Оно хоть и протухшее (2007), но лучше книги по гипервизорам (в общем) и зену (в частности) я не видел.
                            +1
                            Критиковать просто. Вы напишите свой цикл статей. Если он будет умный, интересный и познавательный — вас будет читать больше народу, чем статьи про классический подход. Ждём статьи!

                            Автору этой заметки — отдельное спасибо за то что свёл знания в одну статью. Обязательно жду продолжения. Кстати, про прикладные грамматики тоже бы было интересно почитать.
                              –1
                              amarao подходит с стороны потребителя. И ведь не так важно будет ли дефрагментирован диск или нет, а вот если будет «подвисать» пользовательская программа — плохо! Наверное это должен прочувствовать каждый: когда от дефрагментации не успеет затормозить его машина(когда будет от этой ерунды зависеть чья-то жизнь) или от «свопинга» вы встрянете в лифте на пол часика между этажами. Ребята вы забываете, что платят в конечном счете за коробку, интерфейсы и скорость работы (то есть за готовый продукт который способен совершать полезную работу, а что вы наблюдаете сейчас — камень в сторону навигаторов и смартфонов)

                              P.S. За что минусовали господина amarao?
                                0
                                В статье речь идёт не о создании ОС для реальной работы. Главная цель ОС, которую мы пишем, — быть наглядным пособием. Поэтому нам в общем-то всё равно, за что «платят в конечном счете».
                                  –1
                                  В таком случае вы непойми к чему прийдете. Получите очередной MS-DOS 6.22 и на этом навероне успокоитесь. Наверное нужно всетаки поставить цель. Хотя бы что бы под вашей системой в конечном итоге собрался какой-нить UNIX проект вроде Samba. Мне кажеться это будет не очень сложно и все же показательно.

                                  P.S. Обратите внимание на MINIX целью проекта является тоже ОС для изучения.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                Лиха беда начало.
                                Позновательно, интересно и… интригующе)
                                Удачи вам в написании дальнейших статей цикла!
                                  +9
                                  ftp.linux.org.ua/pub/docs/mirrors/gazette.linux.ru.net/rus/articles/toy-os/toy-os.html
                                  linuxgazette.net/77/krishnakumar.html

                                  Очень хотелось бы чтобы авторы цикла не погрязли в подробностях чтения с диска и загрузки русских шрифтов. Могу посоветовать реализовать Multiboot specification [1] и грузиться сразу GRUB'ом. А также побыстрее избавиться от чисто-ассемблерной реализации и показать, как смешивать Си с ассемблером в строго необходимых пропорциях.

                                  [1] www.gnu.org/software/grub/manual/multiboot/
                                    +1
                                    Именно! Про это я и говорю. Меньше возни с локальной спецификой, больше обзора с высоты птичьего полёта.
                                      +6
                                      Вся теория должна подкрепляться практическими занятиями.

                                      «Высота птичьего полета» без азов не позволит сделать «лабораторную работу» самостоятельно и сознательно без тупого copy-paste из статьи.
                                        +4
                                        Я ж и говорю: нужно взять готовые компоненты, переложить на них второстепенные детали и начать делать систему. Операционную. А не программу, которая живёт в MBR.

                                        Возьмите XEN или другой PV-гипервизор (вроде, vmware умеет с pvops работать тоже), напишите свою ОС. Не на ассемблере. На Си. Компактную. Чтобы ВСЯ ос укладывалась в 10-20кб исходного кода. Вот это будет действительно хорошим обучающим примером.

                                        А чему вы научите людей с загрузкой? Тому, что на PC всю жизнь биосы страдали шизофренией, пытаясь засунуть в позапрошлые стандарты стандарты новые? Даже попытка думать о всех этих LBA, ECH и ещё десятку прочих костылей по эмуляции числа головок и цилиндров у меня головную боль вызывает (к вопросу о костылях:
                                        http://ru.wikipedia.org/wiki/Ограничения_на_размер_жёстких_дисков_персональных_компьютеров, вы действительно хотите людей знакомить с ЭТИМ?)
                                          +3
                                          Судя по всему — вы знакомы со всем этим. Я — нет. Мне будет совершенно непонятно что делают всякие там готовые гипервизоры и т.п.
                                          Без понимания принципов работы я не смогу написать эффективную операционную систему.

                                          Операционная система — это не какая-нибудь прога на высокоуровневом языке, где натаскал кнопок на форму, и готово.
                                          Я обязан иметь низкоуровневое представление о железе, о BIOS или, там, EFI, который тоже является Basic IO Sistem, и т.п.

                                          Понятно, что в дальнейшем следует использовать некоторые обкатанные готовые решения, но если сходу начинать с этого, то приходим к полному непониманию принципов работы операционной системы.
                                            +5
                                            Э… Боюсь, вы неправильно понимаете то, чем занимаются ОС. ОС НЕ должна знать про BIOS, железо и прочие плебейские вещи.

                                            Для того, чтобы предоставить возможность ОС работать с железом уже давно придумали уровень абстракции — драйверы/модули. Ядро не знает, как именно программируется указанный контроллер. Ему пофигу, как именно нужно обрабатывать кнопки с очередной мегамышки с сенсорным управлением. Её дело — передать прерывание в нужный драйвер. И вызвать интерфейс этого драйвера, когда потребуется функционал устройства.

                                            Если вы хотите глубоко ковыряться в том, из каких атефактов состоит современный компьютер, то нужно не ОС писать, а ковыряться с биосами. OpenBIOS, кстати, вроде даже есть и кое-где используется.

                                            ОС — это управление памятью и процессорным временем (процессами), а не ковырение в БИОСе.
                                              +2
                                              До уровня абстракции мне далеко, мне проще работать с железом напрямую. Да и до железа мне далеко.
                                              Для того чтобы пощупать все это на практике — нужно начинать с простого и самописного. Считаю что «Hello World» — лучшее начало.

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

                                                +2
                                                Вам _проще_ работать с железом напрямую? Тогда я задам вам один неприличный вопрос: зачем вы используете абстракции биоса, вместо того, чтобы изящно и просто записать нужные значения в регистры контроллера? Ведь именно это делают драйвера ОС, а вовсе не вызовы биосов.

                                                Я не понимаю вашу позицию. Точнее, я её могу понять в режиме «о, гляньте какую я программу написал с использованием только вызовов биоса», но каким образом это относится к ОС — не понимаю совершенно.
                                                  +2
                                                  Я не пользуюсь функциями BIOS, также как и, почти, не пишу программы для PC.

                                                  BIOS я упомянул как почти неизбежного посредника для загрузки ОС, а также из-за простейшей реализации вывода текста на экран. (это я знаю из ВУЗ-овской теории)

                                                  Про железо — вы меня неправильно поняли. С ним на PC я дело не имел. Разве что только с UART через стандартный API.

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

                                                  Но это совсем другое железо и серьезные ОС для PC я представляю слишком издалека. Мне неведома виртуальная память и ее менеджеры и т.п. Мне проще начинать почти с нуля.
                                                  Потому, как для новичка, мне очень нравится статья, т.к. лично мне пока все понятно.
                                            +1
                                            Ну как вы не поймёте — это статья поможет людям разобраться в основах. Да, на низком уровне. Но, имхо, стыдно быть программистом, и не знать именно вот этих основ, которые уже потом обросли интерфейсами.
                                              0
                                              Возьмите XEN или другой PV-гипервизор (вроде, vmware умеет с pvops работать тоже), напишите свою ОС. Не на ассемблере. На Си. Компактную. Чтобы ВСЯ ос укладывалась в 10-20кб исходного кода. Вот это будет действительно хорошим обучающим примером.
                                              А можно поподробнее? И про другие готовые компоненты.
                                                0
                                                Можно. У меня в черновиках уже копятся статьи по зену, там, в частности, примеры простейших PV-ядер на Си.

                                                «Другие готовые компоненты» — это возможность в коде ядра использовать примитивный код frontend'ов, перекладывая разбирательство с регистрами контроллеров и прочей мелочью на ядро в dom0.
                                                  0
                                                  Надеюсь, что вы эти статьи опубликуете на Хабре, было бы очень интересно.
                                          +1
                                          Совершенно согласен, штука черезвычайно удобная.
                                          Сам недавно пытался написать ОСь, дошел до хелоу ворда, стал разбираться с таблицей дескрипторов, да и забросил как-то… 8(
                                            +2
                                            поддерживаю в том, чтобы поменьше ассемблера! учил раньше ассемблер, но что-то мне он не по нутру пришелся, скучен. Гораздо интересней на мой взгляд реализация функций самой ОС.
                                            +7
                                            Таненбаум одобряет))
                                              0
                                              Кстати пытался купить этого таненбаума, а именно «Операционные системы: Разработка и реализация», вот нет нигде в продаже.
                                                0
                                                Могу в привате сылкой кинуть.
                                              +6
                                              Я хочу видеть ваш сотый выпуск. С первым вы справились. Тема очень интересна. Я бы предложил вам пока не думать о защищенном режиме, он очень сложен. Поставьте себе цель — написать ОС реального режима, пусть она будет псевдо-клоном ДОС, это не имеет значения, т.к. статьи будут нести сугубо обучающую цель. Придумайте формат исполняемых файлов, формат драйверов. И не бойтесь ошибиться, еще раз повторюсь, ваша цель — показать в каком-то очень примитивном приближении как устроены и функционируют ОС и не более.

                                              И пусть будет много примеров, как все компилируется, как отлаживается, такой туториал чтоб получился. Успехов.
                                                +2
                                                > Поставьте себе цель — написать ОС реального режима

                                                Какой в этом смысл? Пройтись по всем граблям слоя совместимости в современном BIOS (разных производителей!) и в современном железе? У реального режима сейчас только одна функция — дать возможность прыгнуть в защищённый. Даже BIOS в процессе POST, насколько я знаю, временно переходит в защищённый.
                                                  0
                                                  Грабли слоя совместимости в современном BIOS? Я не имею о них ни малейшего понятия. Для таких как я и будет полезен этот цикл статей. Я занимался низкоуровневым программированием в течение года, и могу сказать, что реальный и защищенный режимы — это как небо и земля, и сможет ли уважаемый автор начать сразу защищенного (я конечно не знаю уровня его подготовки), и поймут ли эти статьи те, на кого они расчитаны. Я бы написал ОС реального режима, а потом бы начал второй цикл статей об ОС защищенного режима. Задачи-то надо ставить реальные, которые можно осуществить. Если автор сможет сразу начать с защищенного режима и объяснить в свох текстах это так, чтобы другие поняли, было бы замечательно.
                                                    –3
                                                    Чтобы научиться ездить на автомобиле, нужно знать, каково это — падать с лошади?
                                                      +1
                                                      Да, чтобы научится работать с защищенным режимом нужно сначала научится работать с реальным. Абсолютно верно.
                                                        +1
                                                        Я бы сначала научился трогаться и тормозить, но никак не учиться ездить на велосипеде до поездки на машине. Это разные вещи.
                                                          –1
                                                          Как знание (и даже понимание) 64-килобайтных перекрывающихся сегментов поможет в написании кода работы с дескрипторами? Каким образом знание номеров портов и адресов страниц видеопамяти поможет написать драйвер для современной видеокарты Intel? Как знание портов ввода/вывода COM-портов поможет программировать EHCI?
                                                    0
                                                    Своя ОС реального режима у нас уже есть :) Хотелось бы пойти дальше. А вообще вы вполне правильно говорите, наша основная цель — чисто образовательная. Спасибо.
                                                      0
                                                      Так вы себя образовываете или кого-то еще? Если себя, то почему-ю не начать с Таненбаума и MINIX? Третий миникс — вполне достойная вещь для изучения, маленькая, простая, грамотная.
                                                        0
                                                        И то, и другое. Что такое миникс и с чем его едят, мы знаем.
                                                    +2
                                                    О, ностальгия :) Было инетересно почитать.
                                                      +2
                                                      > как же на самом деле работает эта сложная система из железа, кремния и множества программ
                                                      На самом деле не так уж сложно. Кроме общей архитектуры ЭВМ читаем еще теорию автоматов и схемотехнику по триггерам и прочим мультиплексорам. И вот уже в общем-то понятно зачем вашей машине тактовый генератор и что же на самом деле происходит внутри процессора :).

                                                      > Создаём образ диска и заполняем его нулями
                                                      Не могу молчать ибо вырвиглазное решение. Не проще dd'ой из /dev/zero писать сколько надо?
                                                        +1
                                                        Спасибо за /dev/zero, во время написания статьи просто про него забыли.
                                                          +3
                                                          Кстати, если кому интересно поковырять машину так сказать с нуля, есть замечательный комплекс Proteus — тут вам и эмуляция схемотехники, и возможность программировать и запускать полученные программы. Правда она больше ориентирована на микроконтроллеры, но вроде в последних версиях добавили 8086.
                                                            +1
                                                            Спасибо, обязательно посмотрим.
                                                          +2
                                                          писал я курсовиком операционку реального режима на асме. суровое все-таки занятие… Если будете развивать дальше — молодцы!
                                                            0
                                                            Было бы интересно увидеть написанное + комментарии отдельными статьями.
                                                              +3
                                                              статей увы не могу — маленькая *то, о чем нельзя говорить на этом сайте*, а написанное попробую отыскать, уверен, что должно остаться на винтах
                                                            +2
                                                            Спасибо за статью! Буду следить. А рассылку не планируете делать?
                                                              0
                                                              О рассылке не думали, потому как есть RSS. Но если будет много желающих — сделаем.
                                                              0
                                                              А мне вот интересно, это сейчас у нас есть виртуальные машины, в которых мы можем проводить любые самые садистские эксперименты. А как же тестировали подобные программы лет 15-20 назад?
                                                                0
                                                                2 машины или compile-reboot-test.
                                                                  0
                                                                  15 лет назад не знаю, а чуть раньше у компьютеров были средства аппаратной отладки. Выполнить одну операцию, посмотреть состояние регистров, поменять регистры — и всё это кнопками на панели управления ЭВМ… В каком-то смысле lowlevel там было отлаживать даже проще.
                                                                    +3
                                                                    У нас в институте были учебные стенды, на которых память писалась / читалась вручную побитово. Светодиодная индикация состояний, тактирование вручную (дергаешь рычажок и представляешь себя тактовым генератором :)). Честно говоря, доводило до полуистерического состояния :).
                                                                      0
                                                                      В более серьёзных машинах можно было ставить breakpoint'ы на флаги условий и инструкции.
                                                                        0
                                                                        У нас в универе была программка BasePC, написанная на делфях студентами же (есть и стенды, но они уже в музее). Тоже всякие программки в 16-ричных кодах писали и потактово выполняли. Было весело.
                                                                        0
                                                                        Они и сейчас есть. JTAG, например, очень распространен. Почти уверен, что какой-либо отладочный интерфейс есть и у современных x86. Скорее всего тот же JTAG.
                                                                          0
                                                                          JTAG, да, но я не совсем представляю как он выглядит для LGA'шных процессоров. Вроде бы, на P2 это был аппаратный переходник между сокетом и процессором с подсоединением к определённым ногам процессора внешнего управления (давно читал, детали не помню). Но в любом случае, это менее удобно, чем встроенный отладчик, показывающий всё состояние компьютера (включая периферию).

                                                                          Правда, «тогда» и периферия попроще была.
                                                                            0
                                                                            Никогда не интересовался. Возможно просто используют специальные мамки с установленным коннектором.
                                                                            0
                                                                            JTAG, да, но я не совсем представляю как он выглядит для LGA'шных процессоров. Вроде бы, на P2 это был аппаратный переходник между сокетом и процессором с подсоединением к определённым ногам процессора внешнего управления (давно читал, детали не помню). Но в любом случае, это менее удобно, чем встроенный отладчик, показывающий всё состояние компьютера (включая периферию).

                                                                            Правда, «тогда» и периферия попроще была.
                                                                        +1
                                                                        Кстати, я сейчас подумал… Xen в PV режиме обеспечивает идеальную инфраструктуру для «полигонных ОС».

                                                                        По списку:

                                                                        1) Загрузка начинается гипервизором. Гипервизор читает файл ядра и выполняет его. Файл — обычный elf.
                                                                        2) Запуск идёт сразу же в родном режиме процессора, без какого-либо 16-битного мучения.
                                                                        3) Оборудование абстрагировано, реализация xen'овского драйвера блочного и сетевого устройства настолько примтивна, насколько это возможно.

                                                                        Зато можно сразу же сфокусироваться на задачах ОС, а не на задачах груба/коде иницизализации защищённого режима.
                                                                          +1
                                                                          Grub тоже должен кто-то написать ;)
                                                                            +2
                                                                            Конечно. И libc тоже кто-то должен написать. И скедулер процессов, и ld и всё остальное кто-то должен писать. Но мы же про ОС? Каким образом оказывается код ОС в памяти — это system specific. Например, в одной системе нас читают из MBR и далее по списку, а в другой — и у нас есть функции для подгрузки кода по PXE, а то и с NFS-шары.

                                                                            А в третьем случае нам вообще не надо ничего грузить, и весь код уже находится в ROM'е embedded железки.

                                                                            Это не задача ОС — решать проблему начальной загрузки.
                                                                              0
                                                                              Но задача весьма интересная и в принципе необходимая для полного понимания работы компьютера. Поймешь один вариант, будет легче с остальными. Так что, имхо, тоже полезно знать.
                                                                                0
                                                                                Ну да, человек, который разберётся в том, как получилась современная LBA48, в компьютерах будет знать не много, а очень много.

                                                                                Только потребует это много времени и немного шизофрении.

                                                                                Может, лучше сфокусироваться на более стройных вопросах, чем гадости в области IO на PC?
                                                                                  0
                                                                                  Куда же без гадостей-то? При всей стройности высокоуровневых языков, как только залезаешь на нижний уровень обязательно их словишь. Идеальной архитектуры не существует, имхо.
                                                                                    0
                                                                                    Именно! Так зачем, обучая теории тыкать во всякие локальные неурядицы? Чтобы жизнь мёдом не казалась? Это не много не тот путь обучения, который ведёт к стройным знаниям.
                                                                                      +2
                                                                                      Потому, что на низком уровне низком уровне без этого никак. Хотя если создавать сферическую ОС в вакууме чисто для обучения, то возможно вы и правы.
                                                                                        +8
                                                                                        Если вы хотите писать реальную ОС (т.е. ОС для работы), то тем паче, нужно начинать не с биосов и воображаемой топологии диска для совместимости с биосами 1984 года производства, а с представления об архитектуре ОС. Монолитная или микроядро? Драйвера на ring1 или на ring0? Модель работы с процессами (треды это отдельные процессы или сущности внутри процесса?), продумывание SMP архитектуры (при каких условиях приложение будет мигрировать очереди одного ядра на другое?), разработкой терминологической модели (файлы+процессы или другая модель?).

                                                                                        А код MBR — это уж никак не имеет отношения к ОС. Ни к продакту (где эта мелочь отдаётся на откуп бутлоадеру), ни тем паче, к обучающей модели, где нужно акцентироваться на существенных вопросах.
                                                                          –22
                                                                          Расскажите про это автору Bolgen OS :-)
                                                                            +1
                                                                            Жаль что вы для классической архитектуры пишите, иначе могли бы сотрудничать =)
                                                                            Правда мне еще ассемблер нужно написать…
                                                                              +2
                                                                              А у вас архитектура BLOHA?
                                                                              //простите, не смог удержаться
                                                                              –8
                                                                              Здорово. А если хабрасообществом написать ядро ОС? Со временем можно дописать и прочее. И получится отечественная ОС. ))
                                                                                +1
                                                                                Тогда придется в главные разработчики взять Грызлова.
                                                                                  +1
                                                                                  Главное — чтобы с применением нанотехнологий
                                                                                  +2
                                                                                  Вы на распакованный размер сырцов линукса смотрели?
                                                                                    –4
                                                                                    Собственно нет… )) Я далек от этой темы))) Энтузиазм))
                                                                                      +1
                                                                                      Ну так они и запакованные не слабо весят
                                                                                      linux-2.6.35.1.tar.gz — 84.2Mb
                                                                                        +2
                                                                                        В распакованном это удручает куда сильнее. Особенно, когда начинаешь это всё глазами смотреть.
                                                                                      –3
                                                                                      Был тут один. Принципиально новую ОС уже написал. Надеюсь меня в минуса не загонят за упоминание нечистого всуе.
                                                                                        +1
                                                                                        Если бы вы внимательно читали комментарии, то заметили бы, что упоминание Д***** П***** вызывает лютую ненависть и влечет минусы. Двое уже поплатились. Следите, пожалуйста, за модными тенденциями на хабре :)
                                                                                          +4
                                                                                          Особенно упоминание не в тему.
                                                                                        0
                                                                                        Написать ОС — сложное и трудное занятие. Но это чепуха по сравнению с написанием драйверов. Нет, драйвера то писать как раз легко(если спеки открыты), проблема в том, что их нужно МНОГО. Очень много.
                                                                                        Ведь без драйверов ОС просто не будет иметь никакого смысла…

                                                                                        Пожалуй единственный способ сейчас выпустить на рынок новую ОС — идти по пути эппла, используя ограниченный набор железок.
                                                                                          +1
                                                                                          Вы правы, выпустить на рынок новую ОС, которая станет реальным конкурентам существующим, — это очень и очень сложное дело. Но это и не входит в наши планы — мы пишем, можно сказать, «игрушечную» ОС. И основная цель этой ОС и цикла статей — чисто образовательная.
                                                                                        +10
                                                                                        А… Ну как же… Баловался конечно в детстве. Был довольно неплохой загрузчик, который мог грузить MS-DOS, PC-DOS, DR-DOS, PTS-DOS, и собственно саму мою «операционку». Можно взглянуть на него в файле LOADER_S.ASM (LOADER_S.BIN — скомпилированный). А так-же можно поиграться в дос-боксе с 5-ю командами, запустив HBIOS.COM. Если нужно грузить с дискеты — надо заремарить первый джамп в HBIOS.ASM (jmp dos_start).



                                                                                        Качнуть этот ужас, если кому интересно, можно здесь: rghost.ru/2352097
                                                                                        Спасибо авторы, прямо ностальгия какая-то )) Пишите еще.
                                                                                          +1
                                                                                          > perl -e 'print "\0" x 1474560' > disk.img

                                                                                          o.O

                                                                                          А $ dd if=/dev/zero of=disk.img bs=1024 count=1440 не поможет? :)
                                                                                            0
                                                                                            Поможет :)
                                                                                              0
                                                                                              + размер дискеты, вроде: 1 457 664

                                                                                              ** Дюка носил дискетами вот и запомнил размер архивчика **

                                                                                              :)
                                                                                                0
                                                                                                последние 4 байта должны быть особыми — читайте статью внимательней)
                                                                                                  0
                                                                                                  *два >.<
                                                                                                  плюс размер кода… забивается только «лишнее» место
                                                                                                  0
                                                                                                  У обычной дискеты две стороны, на каждой стороне по 80 дорожек, в дорожке 18 секторов. Размер одного сектора — 512 байт
                                                                                                  2 * 80 * 18 * 512 = 1474560
                                                                                                  Вроде всё сходится :) Может быть, вы говорите о размере образов диска, в которых была какая-нибудь дополнительная информация, например контрольная сумма.
                                                                                                    –2
                                                                                                    Для эксперимента:
                                                                                                    возмите ДОСовский RAR 2.0
                                                                                                    и создайте архив для записи на 3-дюймовку
                                                                                                    получите размер файла = 1 457 664
                                                                                                    * конечно если размер архива > дискеты :)
                                                                                                      +2
                                                                                                      А, теперь я понял, в чём ваша ошибка. 1 457 664 — это не ёмкость дискеты. Это максимальный размер файла, который можно записать на дискету, на которой уже есть файловая система (как правило, FAT). В таком случае на дискете кроме самого файла будет ещё таблица блоков и другая служебная информация.

                                                                                                      В нашем же случае никакой файловой системы на дискете нет. Отсюда и нестыковка.
                                                                                                +2
                                                                                                как-то все сильно x86-специфично. биос, фиксированные адреса памяти, сектора какие-то.

                                                                                                >. Строка org 0x7C00 нужна для того, чтобы ассемблер (имеется в виду программа, а не язык) правильно рассчитал адреса для меток и переменных

                                                                                                «программа», которая это делает, называется linker. ld-скрипты и описание секций — вообще отдельная, довольно вредная тема
                                                                                                  0
                                                                                                  В данном, простейшем, случае совершенно излишне углубляться в подробности про ассемблер и линкер.
                                                                                                  +1
                                                                                                  Да, ну начало — это всегда весело. Буду ждать продолжения :)
                                                                                                  И, кстати, на мой взгляд, было бы куда веселее купить какой-то ARM-девайс с DX и писать под него и для него. Тогда, глядишь, и сообщество бы подтянулось.
                                                                                                    0
                                                                                                    Из тех, кто купил себе такой же? :-/
                                                                                                      +1
                                                                                                      Да они же похожие друг на друга, и по конфигурациям и по процессорам. Вот что-то типа такого: www.dealextreme.com/details.dx/sku.39448. Да и даже, если из тех, кто купил такой же — чесслово, был бы интересный предлог, так еще и не такое покупают.
                                                                                                        0
                                                                                                        А, я не про те девайсы подумал, как слышу ARM-девайс сразу представляю либо промышленный компьютер, либо печатную плату, либо вообе чуть ли не SoC
                                                                                                      –1
                                                                                                      старые мотороловские телефоны хорошо для такой развлекухи подходят — собрал бинарник, по usb в память загрузил, управление передал и по нему же обратно что-то получил

                                                                                                      ну и вообще, 2010 год, вокруг куча всякой электроники, от роутеров до айпадовс и телефонов, с нормальными процессорами и интересной архитектурой (кто знает, сколько ядер в процессоре айфона или дрима/дезайра и как они грузится, а?), а тут рассказывают про какое-то унылое легаси 84-го года и сектора дискет, сто раз обсосанные даже в птушных учебниках.
                                                                                                        0
                                                                                                        Для айпада или роутера, конечно, писать интереснее. Но у многих ли под рукой есть лишний айпад, с которым не жалко поэкспериментировать?
                                                                                                          –3
                                                                                                          >у многих ли под рукой есть лишний айпад, с которым не жалко поэкспериментировать?

                                                                                                          а вот плохо быть нищебродом.

                                                                                                          старая моторола на нептуне стоит пару сотен рублей и неубиваема, например (начальный бут зашит в ROM проца)

                                                                                                          среди роутеров тоже есть относительно дешевые неубиваемые модели (asus wl520 какойто) — если что-то запорол, достаточно загнать в рекавери и по TFTP залить бекап.

                                                                                                          AFAIK, даже в айпаде/айфоне тоже начальный бут живет в роме и спокойно восстанавливается.

                                                                                                          системщина на x86 уже никому не нужна, а вот свободная риалтаймовая операционка для линейного процессора в 3g телефоне — это нужная сообществу вещь
                                                                                                            +1
                                                                                                            «системщина на x86» практически у всех под рукой, а вот, нестандартные железки с ARM хоть и есть почти у всех, но единообразного доступа к загрузке своего ПО они не имеют.
                                                                                                            Да и аппаратно они сильно отличаются. Просто так «Hello World!» не напишешь — видео ведь разное (если вообще есть).
                                                                                                              0
                                                                                                              ЗЫ: Несмотря на то, что 99.9 % мобильников имеют ядро ARM — легального и доступного способа загрузить свое нативное, а тем более низкоуровневое ПО в большинстве случаев нет.
                                                                                                              (хотя, судя по постам на хабре, в РФ вполне легально, но также труднодоступно)
                                                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                0
                                                                                                                хорошая штука, но это покупать надо, еще и заказывать где-то.

                                                                                                                поиграться можно и с подручными средствами, тем более, что, например в телефоне есть RF-тракт, который можно приспособить к полезным делам
                                                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                    +1
                                                                                                                    Например, «IBM PC совместимый» компьютер ;)
                                                                                                              0
                                                                                                              BeagleBoard, $150
                                                                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                            0
                                                                                                            спасибо, очень интересно и познавательно. отдельный особый респект за доступность изложения.
                                                                                                              +1
                                                                                                              ох, все никак на Таненбаума глаза не поднимались почитать, надеюсь вы изложите суть. дарю немного кармы вам обоим, чтоб не забросили это дело. жду продолжения!
                                                                                                                0
                                                                                                                Спасибо, будем стараться. Но Таненбаума лучше всё-таки почитайте :)
                                                                                                                +1
                                                                                                                Замечательная статья, но хочется, действительно, более актуальных знаний. Отчасти комментаторы выше правы: хотелось бы кода на C, загрузки через тот же grub и multiboot, защищенный режим и т.п… Но при этом я категорически не согласен с тем, что надо давать исключительно теорию — практический код, как у Вас, это замечательно, гораздо легче понять то, что можно откомпилировать и сразу посмотреть, как что работает.
                                                                                                                  +4
                                                                                                                  Мы планируем в дальнейшем перейти на C и защищенный режим, ибо долго оставаться в ассемблере в real mode — это явный мазохизм.
                                                                                                                    0
                                                                                                                    Полностью согласен. Любая теория должна закрепляться практикой.
                                                                                                                    Практика — это возможность обратной связи. Обратная связь позволяет устранить неправильное понимание реальности.

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

                                                                                                                    А для обучения пользованием такими инструментами как grub все-равно нужно рассказать про принцип его работы и показать простейшие практические примеры.
                                                                                                                    Собственно, здесь рассказано как запускается загрузчик, ну и приведен пример простейшей заглушки вместо загрузчика.
                                                                                                                    +1
                                                                                                                    в школьные годы тоже ос из-за интереса писал, сделал текстовый реактор на 4 или 6 секторов. в 1 секторе была команда подгрузки остальных секторов к 0x7C00 + 200 по 13 прерыванию. но более 6 секторов не грузилось я предполагал что где-то с 0х8000 продолжается системная память и ос нужно грузить в адреса 0х10000 и туда джампить.
                                                                                                                    конечно все это интересно, но мне до сих пор не пригодилось…
                                                                                                                      0
                                                                                                                      Никогда не знаешь, что пригодится в жизни. Например, мне на нынешней работе очень пригодились знания, полученные при создании своей первой ОС.
                                                                                                                      +1
                                                                                                                      Лет пять назад то же самое было на каком-то сайте в рунете. Тоже то ли по выпускам, то ли по урокам разбито было.
                                                                                                                        0
                                                                                                                        Если найдёте ссылочку — будем благодарны. Всегда полезно посмотреть на опыт других людей.
                                                                                                                      +1
                                                                                                                      Очень много про диск, а по-моему важнее написать про прерывания, порты, защищенный режим и тд
                                                                                                                        0
                                                                                                                        Про прерывания, порты и защищённый режим будет сказано ещё очень много. Это же только первая статья.
                                                                                                                          +1
                                                                                                                          Если есть возможность, то писать и с историей вопроса.
                                                                                                                          Т.е.: почему именно такое смещение, почему возникли таймеры, прерывания, что такое страница видео памяти. и почему сообственно страница.

                                                                                                                          Просто легче будет пониматься почему ОС надо писать так, а не иначе, а то есть вероятность, что получится просто хороший сборник статей с зубрёжкой о том, что надо писать, а не почему так.
                                                                                                                            +1
                                                                                                                            Очень правильное замечание, примем к сведению. Однако хочется, чтобы после этого статья не сильно раздулась в объеме. Постараемся следить за балансом размера и содержания.
                                                                                                                              0
                                                                                                                              Рад, что услышали комментарий :)
                                                                                                                              Спасибо.
                                                                                                                        –1
                                                                                                                        Спасибо за статью, буду ждать продолжения. Как-то тоже пробовал написать свою ОС, чтобы пописать на языке С. Дошел до того, что она писала «Hello world!» и вешала компьютер. :)
                                                                                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                            0
                                                                                                                            Продолжайте, главное не забрасывайте. Очень интересно почитать.
                                                                                                                              +2
                                                                                                                              не хочется читать то чего в интернете полным полно.
                                                                                                                              Очень интересно прочитать про новые подходы в разработки ОС
                                                                                                                              Например про проект микрософта en.wikipedia.org/wiki/Singularity_(operating_system)
                                                                                                                                0
                                                                                                                                Вы правы, Singularity — это очень интересная система, мы сейчас с ней знакомимся. Спешу вас заверить, что мы не собираемся замыкаться на классических архитектурах ОС и будем стараться изучать новые подходы. Вполне возможно, наша система будет включать какие-нибудь новые, современные идеи.
                                                                                                                                –4
                                                                                                                                Ждем желтую прессу в топике и завтра увидим в новостях «Сенсация: Харб пишет свою русскую ОС!» =)
                                                                                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                                    0
                                                                                                                                    Вы правы, Singularity — это очень интересная разработка. Мы сейчас активно изучаем это направление.
                                                                                                                                    –4
                                                                                                                                    Полагаю, что авторам нужно було указать, что бут сектор — это не что иное, как обычный файл COM под старый ДОС, который имеет 2 принципиальных отличия:
                                                                                                                                    1. Смещение 0x07C0 вместо 0x100
                                                                                                                                    2. Специвичный размер с обязательным окончанием

                                                                                                                                    И написать, что прерывания ОС (> 0x20) использовать НЕЛЬЗЯ

                                                                                                                                    Посему полагаю, что можно было писать и тестить COM под DOSBOX, а потом, когда настанет ппц (Размер нашего чуда перевалит за волшевные 510 байт) нужно будет учиться либо оптимизировать код, либо грузить код из файла (т.е. научиться понимать файловые системы).

                                                                                                                                    Предлагаю Авторам таким образом создать лоадер для ОС, т.к. варианту osfrofscratch посвящена ОС FreeDOS, а написать толковое врядли получится.

                                                                                                                                    На «продакшн» будет залит только перекомпиленный COM и всё будет в шоколаде.

                                                                                                                                    Сознаюсь, что самому написать лоадер не хватило усидчивости.
                                                                                                                                      0
                                                                                                                                      ДОС грузиться после бут сектора!
                                                                                                                                        +2
                                                                                                                                        Никакой это не «COM под старый DOS». В DOS, как минимум, память размечена была и сегмент описания программы был перед загруженной программой. Не говоря уже о стеках и прочих «мелочах».
                                                                                                                                          0
                                                                                                                                          Лабы в универе писал в виде COM, только не
                                                                                                                                          ORG 100h писал, а 7C0h и линуксом писал в бут (с помощью dd), а на саму дискету (сдавать на ней нужно было) записывал только исходник.

                                                                                                                                          И проблем не было, т.к. размеры лаб не превышали 300 байт :)

                                                                                                                                            +2
                                                                                                                                            Полагаю, что вам следует знать, что COM — это Copy Of Memory, обычный бинарный файл, который DOS (по причине наличия расширения из 3 букв) считает исполняемым. Кроме того, файлы — это абстракция более высокого уровня, чем излагаемый материал (у нас пока и файловой системы-то нет), и поэтому неуместно сравнивать программу начальной загрузки с COM-файлом. То, что прерывания ОС использовать нельзя, должно быть очевидно — никакой ОС пока ведь и нету :) В общем, обратите внимание, что реальный режим и DOS — не одно и то же, хоть во многом и похоже.
                                                                                                                                              0
                                                                                                                                              > Полагаю, что вам следует знать, что COM — это Copy Of Memory, обычный бинарный файл, который DOS (по причине наличия расширения из 3 букв) считает исполняемым

                                                                                                                                              Да, это так

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

                                                                                                                                              Надеюсь, что со мной не будут спорить о том, что при запуске первый физический сектор бут девайса копируется в память и ему передается управление? отлично!
                                                                                                                                              Поэтому ДЛЯ ДЕБАГА нам достаточно использовать COM, но учитывать, что некоторыми вещами МЫ не можем пользоваться (т.к. их нам предоставляет ОС). А для работы потребуется пересборка з корректировкой 1-й строки :)

                                                                                                                                              Опробовал сам на лабах. Работает.

                                                                                                                                                +2
                                                                                                                                                Да, работает, сами так делали при написании Victoria OS. Но мы не планируем слишком долго сидеть в реальном режиме.
                                                                                                                                                  –1
                                                                                                                                                  т.к. в защищенный режим проц. переведет ядро ОС при инициализации, то на стадии загрузчика нет смысла о нем сейчас и разговаривать. Считаю режимы проца темой отдельной, требующей внимательного рассмотрения для аудитории. Также считаю Необходимой ее рассмотрение до проектирования подсистемы управления / распределения памяти. + нужно учесть, что желательно для данной ОС иметь с какой-либо другой ОС совместимость (бинарную), хотя бы с ДОСом. т.к. Это достаточно важно. А имея ОС и не имея софта под нее она становится бесполезной. Вариант совместимости могу предложить в виде виртуальной машины ДОСа (рассмотрим заодно и режим аппаратной виртуализации).
                                                                                                                                                    +1
                                                                                                                                                    Вопрос совместимости с существующими ОС мы считаем второстепенным. Для нас самое важное — наглядность процесса разработки. Добавление совместимости только усложнит и так непростое дело и запутает читателей (по крайней мере, на первых этапах).

                                                                                                                                                    Не забывайте, что мы делаем систему в первую очередь не ради пользы от конечного продукта, а ради самого процесса разработки.
                                                                                                                                        –1
                                                                                                                                        Спасибо за материал, познавательно и интересно. Жду продолжения.
                                                                                                                                          –1
                                                                                                                                          Очень удачный день на хабре. Три поста об ИИ, а теперь еще и этот… Спасибо авторам.
                                                                                                                                            –1
                                                                                                                                            > Power On Self Test – самотестирование при нажатии ВКЛ
                                                                                                                                            Выглядит неуклюже. Не лучше ли «самотестирование при подаче питания»?
                                                                                                                                              0
                                                                                                                                              Лучше — самотестирование при запуске. Ведь в реальности — POST происходит и при перезагрузке.
                                                                                                                                              Но это мелочи.
                                                                                                                                                –1
                                                                                                                                                в статье, насколько я понимаю, это был перевод, а power on — это всё-таки немного другое.
                                                                                                                                                  +1
                                                                                                                                                  Ну, тогда уж «Power On» можно заменить на «включение». Смысл во всех случаях одинаковый, и всем понятен.

                                                                                                                                                  По мне, так вполне нормально в статье написано, без лишней сухости.
                                                                                                                                                    –1
                                                                                                                                                    То, как в статье, звучит как-то не по-русски. И у меня на кнопке включения компьютера не написано «ВКЛ».
                                                                                                                                                +1
                                                                                                                                                Простите, забыл тег
                                                                                                                                                  +1
                                                                                                                                                  [irony]
                                                                                                                                                    0
                                                                                                                                                    Да еще и веткой ошиблись.
                                                                                                                                                  +1
                                                                                                                                                  Не понимаю восторга комментаторов.

                                                                                                                                                  Сухой остаток от статьи:

                                                                                                                                                  — если в первый сектор диска положить машинный код, и поставить в конец сигнатуру 55AA, то x86 BIOS его загрузит по адресу 0x7C00 и запустит

                                                                                                                                                  Остальное — инструкция по использованию dd, yasm и какая-то беллетристика.

                                                                                                                                                  Вы простите, но это действительно сто раз рассказано.
                                                                                                                                                    +1
                                                                                                                                                    Извините, а вы чего хотели в первой статье цикла?
                                                                                                                                                      +1
                                                                                                                                                      Наверное, архитектуры, целей и т.д… Вы же взяли один мелкий аспект работы с одной (пусть и очень распространенной) архитектурой.
                                                                                                                                                        0
                                                                                                                                                        Статья, можно сказать, пробная. В первую очередь мы хотели в ней показать, какой характер будет носить наша работа и посмотреть на реакцию сообщества, узнать уровень интереса людей к теме. Спасибо за замечание, будем стараться раскрыть эти темы в следующих статьях.
                                                                                                                                                    0
                                                                                                                                                    У меня года три назад тоже была попытка написать свою ОС. Вспоминая те вопросы которые возникали у меня по ходу написания системы, могу сказать что помимо общих принципов построения операционных систем и архитектуры ПК, встал вопрос об удобных средствах разработки и отладки. Как только система станет чуть больше чем Hello World умещающийся в одном секторе, станет очень не просто писать это все в текстовом редакторе, компилировать командной строкой, а потом запускать и смотреть что же получилось. Не имея возможности посмотреть как это все работает внутри будет сложно понять некоторые моменты. Поэтому может имеет смысл посветить одну статью, или хотя бы часть статьи инструментарию для разработки. Например можно использовать eclipse + gdb + vmware чтобы отлаживать ОС было почти также просто как обычную программу.
                                                                                                                                                      +1
                                                                                                                                                      Отладке будет посвящён отдельный разговор. Мы планируем использовать qemu а не vmware из-за его открытости и бесплатности.
                                                                                                                                                      +3
                                                                                                                                                      мои пять копеек. не сочтите за критику, воспринимайте как совет.
                                                                                                                                                      если вы хотите сделать что то дейстительно рабочее, начинать нада с дизайна, пускай и грубого. в первую очередь нужно определится какая целевая платформа у вашей будущей ОС. из текста стало ясно что это минимум 8086. с попыткой прекрутить защищенные режими и возможно ia32 ваш код обрастет костылями и непонятками. просто для саморазвития и удовольствия что то вроде mips значительно облегчило бы жизнь. во вторых, необходимо определится с архитектурой ядра. любая из 3 будет существенно влиять на дизайн следующих компонентов. исходя из этого и целевой платформы разобраться с памятью. решить, будет ли многозадачность, продумать механизмы ipc, синхронизации, шедулер, прерывания, опять же память. вобщем нужно составить проект и начинать закладывать фундамент. а пока это выглядит как постройка дома начиная с окна мансарды.
                                                                                                                                                        0
                                                                                                                                                        Спасибо за совет. Мы сейчас думаем над всеми этими вопросами, в следующих статьях будем стараться исправиться :)
                                                                                                                                                        0
                                                                                                                                                        А загрузочную флэшку таким образом можно сделать? Каким образом?
                                                                                                                                                          –1
                                                                                                                                                          dd
                                                                                                                                                          –1
                                                                                                                                                          Начало интересное. А потом я как-то не понял. Сюсюканье и очевидные вещи, сразу после обещания этого не делать.
                                                                                                                                                            0
                                                                                                                                                            Кому очевидные, а кому и не очень. Почитайте комментарии, даже по нынешнему содержанию статьи у многих возникли вопросы.
                                                                                                                                                            +1
                                                                                                                                                            Нормальная статья, в тему, автор обещал не писать что такое регистры, зачем они и почему, вот и не пишет. Все четко кратко и по существу, кому непонятно в целом литература есть и причем ее просто вагон, кому маловато, пусть поучаствует в написании данного цикла и дополнит его своим бесценным материалом, орать «да что ж вы мать вашу растудыть то делаете, а вот я бы то, оно то конечно даааа», это конечно первое дело когда хочется показать какой ты на самом деле умный.
                                                                                                                                                            Я не понимаю нескольких вещей: неужели вы сумеете удержаться в заданном формате, при таком сложном и объемном материале?
                                                                                                                                                            И не понимаю это сколько времени пройдет при написании такими шагами, пока получится что то, что будет хотя бы приблизительно напоминать ОС? 50, 100, 250 статей? До нового года уложимся?
                                                                                                                                                              +1
                                                                                                                                                              неужели вы сумеете удержаться в заданном формате, при таком сложном и объемном материале?
                                                                                                                                                              Будем стараться изо всех сил.
                                                                                                                                                              сколько времени пройдет при написании такими шагами
                                                                                                                                                              Много. Мы в общем-то никуда не торопимся и пока что никаких сроков не ставим. Если понадобится — можем и год и два писать понемногу. К слову сказать, если дело хорошо пойдёт, — через какое-то время можно будет ещё несколько человек привлечь к разработке кода и написанию статей, тогда быстрее управимся.
                                                                                                                                                              +2
                                                                                                                                                              там где многозадачность, там и проблема управления памятью, и планировщик ядра и много чего ещё. Ну и живём мы уже в 21 веке, можно и многопоточности подумать с самого начала.
                                                                                                                                                                –1
                                                                                                                                                                Погоди пусть хотя бы первые пару тройку статей напишут про реальный режим что бы с ним раз и навсегда покончить. Как правило после этого любая инициатива с ОС заканчивается…
                                                                                                                                                                +4
                                                                                                                                                                >На PC единственное требование к загрузочному сектору — это содержание в двух его последних байтах значений 0x55 и 0xAA

                                                                                                                                                                BIOS в Virtual Box плюёт на сигнатуру, загружает сектор даже без неё.

                                                                                                                                                                Есть ещё несколько нюансов в работе загрузчика. Могут быть по-разному инициализированы CS:IP, что повлечет проблемы с абсолютными переходами. Большинство BISOов их выставляют в 0x0000:0x7c00, некоторые — в 0x7c0:0x0000.

                                                                                                                                                                Желательно подстраховаться в самом начале программы, принудительно задав CS:

                                                                                                                                                                ORG 0x7C00
                                                                                                                                                                jmp 0x0000:start
                                                                                                                                                                start:

                                                                                                                                                                Ещё может быть сюрприз с дефолтным размещением стека — на одних системах он попадает в 0500-7BFF, на других в 07E00-7FFFF. Когда будем подгружать дополнительные модули, желательно с расположением стека уже определиться.

                                                                                                                                                                Если есть желание работать с аппаратурой на низком уровне, стоит изучить спецификацию ACPI. Согласно ей, алгоритмы работы железками записываются на абстрактном языке и помещаются в специальные области памяти. Операционка должна иметь транслятор с ACPI-языка в язык платформы. Этот подход позиционируется как альтернатива системно-зависимым драйверам. Насколько мне известно, на русский эту спецификацию не переводил никто.
                                                                                                                                                                  0
                                                                                                                                                                  Большинство BISOов их выставляют в 0x0000:0x7c00, некоторые — в 0x7c0:0x0000
                                                                                                                                                                  А вот об этом мы не знали. Спасибо.
                                                                                                                                                                    0
                                                                                                                                                                    Большинство BISOов их выставляют в 0x0000:0x7c00, некоторые — в 0x7c0:0x0000

                                                                                                                                                                    Это что, шутка такая? Линейный адрес в реальном режиме формируется как сегмент*16+смещение, так что это один и тот же адрес
                                                                                                                                                                      0
                                                                                                                                                                      Извините, вник в суть. Речь идет о значении регистра cs.
                                                                                                                                                                        0
                                                                                                                                                                        Адрес-то один, но представить его парой сегмент/смещение можно по-разному. Так-то.
                                                                                                                                                                    0
                                                                                                                                                                    Спасибо, жутко интересно, продолжайте дальше. :)
                                                                                                                                                                      –1
                                                                                                                                                                      Помнится в школе тоже с этим всем баловался, вообще хочу сказать что идеальной средой для изучения низкоуровнего программирования является DOS, там есть все средства ввиду отладчика и самого ассемблера, DOS работает в не защищенном режиме поэтому там можно делать с компьютером абсолютно все!
                                                                                                                                                                        +1
                                                                                                                                                                        Спасибо! всем отделом искали дискету )) Работает!!! :D
                                                                                                                                                                          +1
                                                                                                                                                                          Самый первый сектор на диске, загрузочный сектор, читается BIOS'ом в нулевой сегмент памяти по смещению 0x7С00, и дальше по этому адресу передается управление.

                                                                                                                                                                          А почему именно по этому адресу, и что находится в памяти до него?
                                                                                                                                                                            +1
                                                                                                                                                                            Этот адрес был выбран, я полагаю, по историческим причинам. В реальном режиме ниже этого адреса в памяти находятся, например, таблица прерываний и область переменных BIOS.

                                                                                                                                                                            Подробно об этом можно почитать в книге Михаила Гука «Аппаратные средства IBM PC».
                                                                                                                                                                            +2
                                                                                                                                                                            В институте писал свою операционку, первая веха состоялась, когда в реальном режиме заработала многозадачность и командная строка, вторая веха — когда удалось запуститься в защищенном режиме.

                                                                                                                                                                            В то время писать подобные штуки было сложнее, инструментарий был намного хуже.

                                                                                                                                                                            Сейчас жалею, что убил кучу времени на примитивные вещи вроде кода загрузки с дискеты, поддержки защищенного режима итд. Лучше бы сразу взял что-то вроде GRUB, написал поддержку примитивов POSIX и попытался создать пусть и не на 100% собственную систему, но более функциональную.

                                                                                                                                                                            А, самый большой прокол был, что я решил все писать, применяя ООП :-)
                                                                                                                                                                              0
                                                                                                                                                                              Спасибо, что делитесь опытом. Вы абсолютно правы, с точки зрения конечного результата использовать существующие наработки, такие как GRUB, при разработке своей ОС полезно и нужно. У нас немного другой случай, мы эти вопросы (загрузку с различных носителей, переход в защищённый режим) хотим осветить в статьях и потому собираемся писать всё с нуля (благо, опыт уже есть). Короче, наглядность для нас важнее функциональности.
                                                                                                                                                                                0
                                                                                                                                                                                А как все эти вопросы связаны с разработкой ОС? Еще лет 10-15 назад появились книжки, которые достаточно подробно освещают вопросы работы в защищенном режиме и пр. Еще 10 лет назад в профильных листах рассылки энтузиастов такие вопросы стали моветоном…

                                                                                                                                                                                Честно говоря, просто очень обидно за отечество: в то время, как финны еще 20 лет назад начали работу над Linux, а еще через 10 лет над Menuet OS (вроде как финны тоже), у нас до сих пор никто не умудрился написать хотя бы примитивного настоящего ядра с минимальным оконным интерфейсом :-(

                                                                                                                                                                                Из года в год только загрузка с дискеты да переход в защищенный режим остаются самыми зубастыми вопросами российского осдева…
                                                                                                                                                                                0
                                                                                                                                                                                А каким образом осуществлялась многозадачность? В двух словах
                                                                                                                                                                                0
                                                                                                                                                                                Статья — супер!

                                                                                                                                                                                Помню в институте чисто из любопытства накатал программу на ассемблере для 580ИК80 для копирования и проверки микросхем ПЗУ (были такие, Рф2/РФ5 с кварцевыми окошечками для облучения, чтобы стереть информацию).

                                                                                                                                                                                Показал преподу, он как парень :) зачел мне этот проект как курсовик!

                                                                                                                                                                                Ну мне это дело так понравилось, что тему диплома я предложил уже сам — систему тестирования цифровых микросхем. Это была плата с двумя портами 580ВВ55, которые посылают тестовые сгналы и принимают ответ с тестируемой микросхемы, плюс несколько регистров. Плата подключалась через LPT порт к компьютеру на котором была программа написанная под DOS на Паскале с UI библиотекой TurboVision. К этой программе накатал библиотеку с тестами для штук 20 разных микросхем. Прикольно то, что все это реально работало и на защите я сначала рассказал по схеме, алгоритмам, а потом все показал на компе.

                                                                                                                                                                                Из этого диплома потом сделали стенд на кафедру для лабораторных работ.

                                                                                                                                                                                Эх, блин, было время! 93-й год…
                                                                                                                                                                                  0
                                                                                                                                                                                  А вот интересно, насколько жизнеспособен будет этот цикл. Уже не первый раз вижу на хабре «Циклы статей» состоящие из одного, ну максимум трех выпусков. А дальше все забивают.
                                                                                                                                                                                    –1
                                                                                                                                                                                    Видимо, и здесь дальше загрузчика дело не пойдёт.
                                                                                                                                                                                      0
                                                                                                                                                                                      С чего вы так решили? Вторая статья цикла уже на подходе.