Уроки ОСдева №1 / ASM (ASM Comics,ASM Комиксы) :: программирование :: разработка :: Операционная система :: OSDev :: Смешные комиксы (веб-комиксы с юмором и их переводы) :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)

OSDev Операционная система разработка программирование geek ASM Комиксы песочница 

Уроки ОСдева №1

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


P.S.: если знаете английский, советую зайти сюда. Это довольно старая серия уроков по ОСдеву для новичков. Я в своё время почерпнул там очень много и в своих постах наверняка буду невольно цитировать оттуда.



Часть 1, теоретическая.


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


Я думаю, стоит начать с включения компьютера. Это не шутка: чтобы создать свою операционную систему, надо до определённой степени понимать как работает компьютер. Что происходит, когда вы нажимаете кнопку POWER на системном блоке и как у вас на экране оказывается ваш заваленный ярлыками и "новыми папками" рабочий стол? Для того, чтобы программа (а наша ОС - это, конечно же, программа) начала исполняться, она должна сначала попасть в оперативную память. Содержимое оперативной памяти же на момент включения пусто. Если среди читающих есть инженеры, советую зажмуриться и пропустить до следующего абзаца: сейчас будет упрощённая модель.


1. Нажатая кнопка POWER посылает электрический сигнал на материнскую плату.

2. Сигнал доходит до материнской платы и отправляется к блоку питания.

3. Блок питания просыпается и начинает подавать энергию подключенным устройствам.

4. Блок питания посылает сигнал на материнскую плату, начинает исполняться программа BIOS.

5. BIOS проводит POST (power-on self-test), посылая сигналы разным устройствам и получая (или не получая) от них ответ. Если устройство не отправило ответ, оно помечается как нерабочее или отсутствующее. Тут же BIOS определяет количество оперативной памяти и некоторые другие параметры системы.

6. Если POST окончен и никаких критических поломок не выявлено, BIOS сверяется со списком загрузочных устройств. Наверняка вы хоть раз его видели, если устанавливали Windows: его обычно можно настроить через интерфейс BIOS, выбрав, с чего загружать ОС (floppy, HDD, USB, ...).


Вот тут начинается часть, которая интересует нас. Предположим, мы вставили дискету с нашей ОС в привод и настроили приоритет загрузки следующим образом: CD-ROM, флоппи-привод, жёсткий диск, USB. Как BIOS определит, что на одном из носителей есть операционная система для загрузки? Физическое устройство цифровых носителей и способы доступа к информации на них это тема для отдельного урока или даже нескольких, так что пока удовольствуемся упрощённой схемой: BIOS считывает с 0 по 511 байты носителя и проверяет, чему равны байты 510 и 511. Если они равны 170 и 85 (AAh и 55h в шестнадцатеричной системе), BIOS считает, что нашёл программу-загрузчик. После этого считанный участок носителя размером в 512 байт загружается в оперативную память и запускается центральный процессор компьютера, который начинает выполнять загруженную программу. Программа-загрузчик догружает остальные файлы ОС и располагает их в памяти нужным образом, а потом говорит процессору, откуда нужно начать выполнение ОС.


Какие выводы можно сделать из полученной информации?


1. Помимо операционной системы на носителе должна быть программа-загрузчик, т.к. компьютер не знает, как именно структурированы файлы ОС и куда их надо загружать. Загрузка ОС - тоже задача разработчика.

2. Загрузчик должен быть не больше 510 байт, ведь BIOS считывает 512 и последние два из них заняты меткой загрузчика.

3. Последние два байта программы-загрузчика должны быть равны AA55h.

3. Загрузчик должен занимать строго определённое место на носителе: с 0 по 511 байты. Думаю, вы замечали, что когда копируете файлы на носитель обычными методами, никто не спрашивает вас, в какой именно участок памяти вы хотите их поместить. Значит, копировать загрузчик нужно каким-то особенным способом.


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




Подробнее
OSDev,Операционная система,разработка,программирование,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,ASM,ASM Comics,ASM Комиксы,Смешные комиксы,веб-комиксы с юмором и их переводы,песочница
Продолжать?
Да
306 (59.8%)
Единая Россия
206 (40.2%)
Еще на тему
Развернуть
Наброшу и дополню.
О том, чтобы написать свою ОС, задумывался, наверное, каждый программист.
Все вышеперечисленное относится к привычным компьютерам с процессами а архитектурой x86. Но на x86 процессоры не заканчиваются. И если есть желание попрактиковаться в создании ОС по какой-либо причине (ради фана, чтобы лучше понять принципы и устройство ОС итд) и х86 не является обязательным требованием, то можно попробовать начать с других архитектур, это может быть проще.

Проще всего будет писать под микроконтроллеры, например, AVR (впизду, старый 8и-битный отстой) или ARM Cortex M (например, STM32). Микроконтроллеры очень просты, по сравнению с х86, там нет BIOS, а вся загрузка зачастую сводится к нескольким ассемблерным инструкциям. Из недостатков - там чаще всего нет MMU (memory managment unit), т.е. поддержки виртуальной памяти. Это вносит ряд ограничений, но, тем не менее, раньше люди жили и делали полноценные многозадачные ОС. Но на простые микроконтроллеры есть т.н. ОС реального времени, например, FreeRTOS. По-сути, это часть прошивки. Тем не менее, переключение задач, сохранение контекста, межпроцессное взаимодействие (мьютексы, семафоры итп), даже какое-то подобие POSIX - все это можно там реализовать и получить опыт и знания.


Если брать более сложные ARM-процессоры, например, всем известную Raspbery PI, то там уже есть MMU и можно извращаться по полной, реализую полноценную ОС. Тем не менее, я все еще считаю, что это проще, чем x86 со всякими PCI и прочим (жирные ARM тоже умеет в PCI). Там все еще примерно как в микроконтроллерах - просто пиши в регистры и будет тебе счастье.

Ну и, наконец, самый хардкор - это х86 (остальные архитектуры, типо PowerPC и прочую экзотику не рассматриваю).

Из литературы: Э. Таненбаум "Современные операционные системы: разработка и реализация". Хорошая детальная книга об устройстве ОС на примере Minix.
Почему это в комиксах?
sru2 sru2 14.09.201901:29 ответить ссылка 0.1
Сам сначала не понимал, только вчера после публикации поста дошло: видимо, тут где-то есть комикс с названием ASM, поэтому тег подтянулся автоматически. Буду в следующий раз внимательнее.
Сначала не понял что за ААh и 55h значения, ведь в хексе есть значения только до F. Потом подумал что это просто метка, показывающая, что данное число представлено в шестнадцатеричном формате. Это так?
Да, h - просто указатель, что число записано в шестнадцатеричной системе. Кому-то наверное было бы приятнее так: 0xAA, 0x55.
У меня лишь один вопрос - почему это на реахтуре, а не где то на каком нибудь хабре?
Solid T Solid T 14.09.201909:05 ответить ссылка -1.3
чтоб такая ленивая жопа, как я, немного просветилась.
так в какой момент запускается ЦП? или биос своей думалкой обращается к устройству дисковода, выполняет программму драйвера и прочее? может даже на экране малюет что то?
Большая тема, но если тебе угодно: основная часть кода BIOS копируется в оперативную память и исполняется там же центральным процессором. Часть POST, которую невозможно выполнить на ЦП (начальная настройка ЦП, иногда определение RAM), может быть реализована в виде контура на материнской плате. BIOS вполне может обращаться к устройствам "своей думалкой" без драйверов, т.к. большая часть устройств более-менее стандартизирована. Например, твоя обвешанная свистелками геймерская клава будет работать и без драйвера, но лишится "нестандартной" части функционала. Что касается малевания на экране: для того, чтобы пользоваться VGA-картой в текстовом режиме, всего-лишь нужно провести начальную установку регистров и знать область RAM, куда проецируется видеопамять. Всё это BIOS по силам. В современныx системаx ACPI позволяет достаточно просто включать графические режимы даже высокого разрешения и xранить графику для режима загрузки. Если интересно, гугли ACPI, VESA, VGA BIOS, я сейчас это всё расписывать не буду, тема нереально большая.

Что-то ещё забыл? Да, если вдруг кого-то запутал: ЦП, конечно, работает и до полной иницализации системы, но для нас становится доступен уже после POST. Собственно, для нас всё, что происходит до завершения POST, малоинтересно: повлиять программными методами мы тут ни на что не можем.
На материнской плате стоит так называемый чипсет, который, если на него посмотреть очень внимательно, представляет из себя специализированный компьютер со своими процессором (вполне возможно арм архитектуры), памятью и операционкой/микропрограммой/прошивкой, и он вполне себе справляется с выполнением своей части тестов POST.
Вообще если рассмотреть очень внимательно все составные части современного компьютера: центральный процессор, оперативную память, видеокарту, жёсткий диск и всё остальное, то во всех них обнаружатся свои контроллеры со своей памятью и своими микропрограммами/прошивками. То есть то что мы называем компьютером представляет из себя сеть специализированных компьютеров соединённых между собой разными высокоскоростными каналами передачи данных.
mm33 mm33 15.09.201914:57 ответить ссылка 0.1
Авось кому полезно будет:
https://www.lektorium.tv/course/22993
Vovich69 Vovich69 14.09.201915:30 ответить ссылка 1.0
Если это именно про архитектуру, то я не могу не порекомендовать вдогонку знаменитую и очень крутую книжку Харрис и Харрис "Цифровая схемотехника". От логических схем до MIPS-процессора на верилоге.
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
Programmers in Enterprise Company
Programmers in Startup Company
Programmers in Government Ха, новый проект на плюсах! Trying random stuff for hours instead of reading
the documentation