Пишем свою ОС: Выпуск 1 / Хабр
Данный цикл статей посвящён низкоуровневому программированию, то есть архитектуре компьютера, устройству операционных систем, программированию на языке ассемблера и смежным областям. Пока что написанием занимаются два хабраюзера — iley и pehat. Для многих старшеклассников, студентов, да и профессиональных программистов эти темы оказываются весьма сложными при обучении. Существует много литературы и курсов, посвящённых низкоуровневому программированию, но по ним сложно составить полную и всеохватывающую картину. Сложно, прочитав одну-две книги по ассемблеру и операционным системам, хотя бы в общих чертах представить, как же на самом деле работает эта сложная система из железа, кремния и множества программ — компьютер.Каждый решает проблему обучения по-своему. Кто-то читает много литературы, кто-то старается поскорее перейти к практике и разбираться по ходу дела, кто-то пытается объяснять друзьям всё, что сам изучает. А мы решили совместить эти подходы.
Возможно, мы умышленно будем заводить процесс разработки в тупик, чтобы позволить вам и себе полностью осознать все последствия неверно принятого решения, а также отточить на нем некоторые технические навыки. Так что не стоит воспринимать наши решения как единственно верные и слепо нам верить. Еще раз подчеркнём, что мы ожидаем от читателей активности в обсуждении статей, которая должна сильно влиять на общий процесс разработки и написания последующих статей. В идеале хотелось бы, чтобы со временем некоторые из читателей присоединились к разработке системы.
Мы будем предполагать, что читатель уже знаком с основами языков ассемблер и Си, а также элементарными понятиями архитектуры ЭВМ. То есть, мы не будем объяснять, что такое регистр или, скажем, оперативная память. Если вам не будет хватать знаний, вы всегда можете обратиться к дополнительной литературе. Краткий список литературы и ссылки на сайты с хорошими статьями есть в конце статьи. Также желательно уметь пользоваться Linux, так как все инструкции по компиляции будут приводиться именно для этой системы.
А теперь — ближе к делу. В оставшейся части статьи мы с вами напишем классическую программу «Hello World». Наш хеллоуворлд получится немного специфическим. Он будет запускаться не из какой-либо операционной системы, а напрямую, так сказать «на голом железе». Перед тем, как приступить непосредственно к написанию кода, давайте разберёмся, как же конкретно мы пытаемся это сделать. А для этого надо рассмотреть процесс загрузки компьютера.
Итак, берем свой любимый компьютер и нажимаем самую большую кнопочку на системном блоке. Видим веселую заставку, системный блок радостно пищит спикером и через какое-то время загружается операционная система. Как вы понимаете, операционная система хранится на жёстком диске, и вот тут возникает вопрос: а каким же волшебным образом операционная система загрузилась в ОЗУ и начала выполняться?
Знайте же: за это отвечает система, которая есть на любом компьютере, и имя ей — нет, не Windows, типун вам на язык — называется она BIOS. Расшифровывается ее название как Basic Input-Output System, то есть базовая система ввода-вывода. Находится BIOS на маленькой микросхемке на материнской плате и запускается сразу после нажатия большой кнопки ВКЛ. У BIOS три главных задачи:
- Обнаружить все подключенные устройства (процессор, клавиатуру, монитор, оперативную память, видеокарту, голову, руки, крылья, ноги и хвосты…) и проверить их на работоспособность. Отвечает за это программа POST (Power On Self Test – самотестирование при нажатии ВКЛ). Если жизненно важное железо не обнаружено, то никакой софт помочь не сможет, и на этом месте системный динамик пропищит что-нибудь зловещее и до ОС дело вообще не дойдет. Не будем о печальном, предположим, что у нас есть полностью рабочий компьютер, возрадуемся и перейдем к рассмотрению второй функции BIOS:
- Предоставление операционной системе базового набора функций для работы с железом. Например, через функции BIOS можно вывести текст на экране или считать данные с клавиатуры. Потому она и называется базовой системой ввода-вывода. Обычно операционная система получает доступ к этим функциям посредством прерываний.
- Запуск загрузчика операционной системы. При этом, как правило, считывается загрузочный сектор — первый сектор носителя информации (дискета, жесткий диск, компакт-диск, флэшка). Порядок опроса носителей можно задать в BIOS SETUP. В загрузочном секторе содержится программа, иногда называемая первичным загрузчиком. Грубо говоря, задача загрузчика — начать запуск операционной системы. Процесс загрузки операционной системы может быть весьма специфичен и сильно зависит от её особенностей. Поэтому первичный загрузчик пишется непосредственно разработчиками ОС и при установке записывается в загрузочный сектор. В момент запуска загрузчика процессор находится в реальном режиме.
Как устроен загрузочный сектор? На PC единственное требование к загрузочному сектору — это содержание в двух его последних байтах значений 0x55 и 0xAA — сигнатуры загрузочного сектора. Итак, уже более-менее понятно, что нам нужно делать. Давайте же писать код! Приведённый код написан для ассемблера yasm.
section .text use16 org 0x7C00 ; наша программа загружается по адресу 0x7C00 start: mov ax, cs mov ds, ax ; выбираем сегмент данных mov si, message cld ; направление для строковых команд mov ah, 0x0E ; номер функции BIOS mov bh, 0x00 ; страница видеопамяти puts_loop: lodsb ; загружаем очередной символ в al test al, al ; нулевой символ означает конец строки jz puts_loop_exit int 0x10 ; вызываем функцию BIOS jmp puts_loop puts_loop_exit: jmp $ ; вечный цикл message: db 'Hello World!', 0 finish: times 0x1FE-finish+start db 0 db 0x55, 0xAA ; сигнатура загрузочного сектора
Эта короткая программа требует ряда важных пояснений. Строка org 0x7C00
нужна для того, чтобы ассемблер (имеется в виду программа, а не язык) правильно рассчитал адреса для меток и переменных (puts_loop, puts_loop_exit, message
). Вот мы ему и сообщаем, что программа будет загружена в память по адресу 0x7C00.
В строках
mov ax, cs 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!». На этом первая статья заканчивается. Будем рады увидеть ваши отзывы и пожелания.
Литература
- По языку ассемблера:
- Зубков С. В. «Assembler для DOS, Windows и Unix»
- Введение в машинный код
- Программирование на ассемблере под DOS
- По языку Си:
- Керниган Б., Ритчи Д. «Язык программирования C»
- Шилдт Г. «Полный справочник по C»
- По устройству операционных систем:
- Таненбаум Э. «Современные операционные системы»
- Таненбаум Э. «Операционные системы: Разработка и реализация»
- Олифер В. , Олифер Н. «Сетевые операционные системы»
- http://osdev.org
- По архитектуре ЭВМ:
- Таненбаум Э. «Архитектура компьютера»
- Гук М. «Аппаратные средства IBM PC. Энциклопедия»
- Петцольд Ч. «Код. Тайный язык информатики»
- Справочная информация
- Dan Rollins’s TechHelp
- Intel Software Developer Manual
Как создать свою операционную систему для телефона самостоятельно?
Чтобы понять, как создать свою операционную систему для телефона, нужно быть основательно подготовленным. Ведь операционная система для смартфона входит в область сложнейших задач по программированию, так как требует довольно обширных знаний, связанных не только с конкретным языком программирования.
Как создать свою операционную систему для телефона
Операционная система для телефона — это комплексное программное обеспечение, работающее непосредственно с системными ресурсами телефона, плюс является связующим звеном между телефоном и его пользователем. ОС полностью контролирует работу устройства, поэтому любая написанная программа пишется не под конкретное устройство, а под конкретную ОС.
Из чего состоит ОС телефона
Операционная система телефона, как и любая другая, состоит их двух основных компонентов:
Ядро — это «сердечная мышца» любой ОС, которая всегда запускается первой при включении устройства. Именно ядро манипулирует системными ресурсами телефона.
Системный софт — это программы, которые работают «над ядром». Они очень важны для самого ядра, потому что обеспечивают эффективную связь между ядром и приложениями пользователя. В такой софт входят драйвер, файловая система, программы для работы с сетью, системные утилиты и др.
Отдельной составляющей любого телефона являются пользовательские программы, которые не входят в состав операционной системы, но непосредственно с ними работает пользователь устройства, это:
браузер;
аудиоплеер;
блокнот;
книга контактов;
мессенджеры;
и др.
Именно такие программы находятся под контролем ядра, которое выделяет на их запуск необходимое количество ресурсов системы.
Что необходимо знать, чтобы создать свою операционную систему для телефона
Хочется еще раз подчеркнуть, что создание собственной операционной системы — это задача не для новичков, навыки программирования должны быть выше среднего.
Список вещей, которые нужно понимать, чтобы создать свою операционную систему для телефона, достаточно длинный, вот несколько основных пунктов:
Основы информатики. Сюда входит понимание таких вещей, как: алгоритмы, структуры данных, сортировка, манипулирование данными, абстрактное программирование и мн. др.
Английский язык на хорошем уровне. На русском языке очень мало технической документации по созданию операционных систем для телефонов — в основном все на английском. Это же касается и сообществ, которые могут вам помочь — все это только на английском. Помимо английского для общения важен технический английский, чтобы вы могли понимать о чем идет речь в документации, а также правильно формулировать свои вопросы в сообществах.
Язык программирования. Большинство операционных систем используют язык программирования С или С++, поэтому знать эти языки нужно будет в любом случае. Даже если решите создавать свою ОС на другом языке, примеры в документации и большинство готовых фрагментов кода будут именно на этом языке.
Ассемблер. Даже если вы будете писать свою ОС на языке высокого уровня, то местами вам все равно придется применять Ассемблер, поэтому понимание и основы этого языка обязательны.
Опыт в программировании. Если создание своей операционной системы для телефона — это первый ваш проект, то это довольно плохая идея. Вам кроме самого языка программирования нужно еще понимать как осуществляется контроль версий, отладка, оптимизация кода и мн. др.
Много практики на языке, который хотите применять для создания своей операционной системы. Язык не должен быть для вас чем-то новым. Необходимо знать его тонкости и особенности, поэтому на этом языке у вас должно быть реализовано несколько успешных проектов.
Понимание UNIX. Начав работу над своей операционной системой для телефона, вы очень быстро осознаете, что основной инструмент создания ОС тянется еще с UNIX-систем, а за основу ОС очень часто берется ядро Linux.
Концепция операционных систем. Вы должны в общем понимать, как с технической стороны работают операционные системы на телефонах.
И др.
Разработка операционной системы для телефона
Когда за вашими плечами уже есть опыт и практика на Ассемблере и Си (или другой язык) и вы легко разбираетесь в основах информатики, то, в принципе, уже можно приступать к созданию своей операционной системы для телефона.
Тут важно понимать, что над действительно стоящей операционной системой для телефонов трудятся десятки программистов даже в таких компаниях как Google или Apple, при этом на эту сферу у них рассчитаны огромные бюджеты. Но ни труд десятков программистов, ни огромные деньги не спасают их ОС от багов, которые то и дело всплывают.
Поэтому тут важно задуматься, а действительно ли вы сможете самостоятельно создать стоящую ОС? И действительно ли она будет лучше существующих, чтобы создать им конкуренцию? Если да, и вы действительно планируете создать программный продукт, который будет конкурировать с Android или iOS, тогда вам лучше обзавестись хорошей командой. Duolingo apžvalga ir įvertinimas Для этого можно выложить свой проект на GitHub и совместными усилиями «пилить» вашу операционную систему.
Если все-таки вы хотите сделать ОС «для себя», чтобы попробовать свои силы, то можно воспользоваться уже готовыми решениями из сети и «допиливать» их под свои нужды. А можно пойти еще проще и создать собственную прошивку для уже существующей операционной системы.
Литература, которая вам пригодится:
«Linux From Scratch». Это полноценный учебник по сборке операционных систем Linux. Да, там описываются компьютерные операционные системы, но с технической стороны и мобильная, и компьютерная ОС работают практически одинаково.
«The little book about OS development». Еще одна книга о разработке операционных систем для компьютера с самого начала — с установки IDE и до самого конца — до запуска ОС.
Заключение
Как разработать свою операционную систему для телефона? Нужно основательно подготовиться и быть готовым к очень продолжительной работе над своим программным продуктом. Разработка собственной ОС для телефона — это очень сложная задача, но даже она посильна, если есть должное желание и упорство для мотивации к работе.