Это могло быть напрасно, поскольку я знаю, что написать операционную систему невыносимо сложно (особенно самому).
Я не собираюсь создавать следующий Linux или Windows.
Я знаю, что это будет ужасно, с ошибками и не будет работать, но это нормально.
Я хочу писать все сам, на Ассемблере , C и (немного) C ++ .
Это будущий проект, так как в данный момент я занят другими делами и у меня нет времени, но я решил, что спрошу его сейчас, так что, возможно, я смогу получить много ответов на этот вопрос, и это могло бы создавать и быть полезным ресурсом для такого подхода (все остальное, что я видел, включало создание minix, использование существующего загрузчика, создание его в программе виртуальной загрузки и т. д.).
Я хочу настроить один из моих старых настольных компьютеров с монитором, клавиатурой и мышью и начать работу с пустым жестким диском.
Я хочу узнать, как написать свой собственный загрузчик (я нашел много ресурсов по этому поводу, но для полноты, пожалуйста, все же добавьте несколько хороших), мой собственный драйвер USB (если это необходимо), драйвер компакт-диска (если это необходимо ) и т. д. Все, с нуля.
Как мне поместить код в компьютер? Лучше всего это делать с дискеты? Может ли большинство компьютеров сделать это с USB-накопителя?
Какие драйверы мне нужны, и можете ли вы предложить какие-либо рекомендации по их созданию?
После загрузки - что дальше? Как перейти в защищенный режим и т. Д.
Как управлять памятью без помощи операционной системы? Я просто использую те адреса, которые хочу? Инициализация не требуется?
Что, несомненно, меня запутает?
Как сделать как командную строку O / S, так и графическую?
На чем построена графическая операционная система? Например, как мне сделать что-то вроде командной строки со шрифтом и изображением вверху?
Где я могу прочитать о настройке многозадачной среды? (т. е. наличие двух графических командных строк, работающих рядом).
Как мне настроить своего рода оконную систему? Как отображать графику на экране после настройки простой многозадачности?
Поверьте, я понимаю, что это очень сложный проект, и я, вероятно, никогда не дойду до его завершения или написания чего-нибудь полезного.
Я не упомянул еще множество других вещей, и если вы думаете о них, можете добавить их тоже.
Пожалуйста, укажите одну «тему» для каждого ответа - например, драйверы USB, а затем, возможно, список ресурсов, на что следует обратить внимание и т. Д.
Также, пожалуйста, не предлагайте строить другой O / S или уже существующий код. Я знаю, что буду читать много уже существующего кода (например, ядра Linux или примеров ресурсов, существующих драйверов и т.д.), но в конечном итоге я хочу писать все самостоятельно. Я знаю, что должен опираться на что-то еще, и есть много других вопросов по этому поводу, которые я могу прочитать, если передумаю и пойду по этому пути. Но это все о том, чтобы сделать все с нуля.
Есть предложения, как сделать это графическим? Разные видеорежимы и как с ними работать и тд?
источник
Ответы:
Перво-наперво. Читайте, читайте, читайте, читайте, читайте. Вы должны иметь твердое представление о том, как работает ОС, прежде чем вы сможете надеяться реализовать свою собственную.
Возьмите одну из книг Эндрю Таненбаума об операционных системах. Это тот, который мы использовали на моем уроке ОС в колледже:
Современные операционные системы PDF
Современные операционные системы на Amazon
Несмотря на нелепую обложку, это фантастическое чтение, особенно для учебника. Таненбаум действительно является экспертом в этой области, и его объяснения того, как работает ОС под капотом, ясны и легки для понимания. Эта книга в основном теоретическая, но я считаю, что у него также есть книга, в которой подробно обсуждается реализация. Но я его никогда не читал, поэтому не могу это комментировать.
Это должно помочь вам освоить управление процессами, управление памятью, файловыми системами и все остальное, что нужно сделать ядру ОС, чтобы привести его в состояние загрузки. С этого момента в основном речь идет о написании драйверов устройств для оборудования, которое вам необходимо поддерживать, и о реализации функций библиотеки C для выполнения вызовов ядра для таких вещей, как открытие файлов и устройств, чтение и запись, передача сообщений между процессами и т. Д. .
Прочтите сборку x86 (при условии, что вы разрабатываете ее для машины x86). Это должно ответить на многие ваши вопросы относительно перехода между режимами работы процессора.
Если у вас есть какие-либо знания в области электроники, возможно, будет проще начать с написания операционной системы для встраиваемого устройства, имеющего обширную документацию, потому что, как правило, это будет проще, чем ПК x86. Я всегда хотел написать свою собственную ОС, и я начинаю с написания ОС со встроенным микроядром для This Development Board от Digilent. Он может запускать процессор MicroBlaze с программным ядром от Xilinx, который имеет очень подробную документацию. У него также есть оперативная память, флэш-память, светодиоды, переключатели, кнопки, выход VGA и т. Д. Множество вещей, для которых можно поиграть с написанием простых драйверов.
Одним из преимуществ встроенного устройства также является то, что вы можете избежать написания драйвера VGA в течение длительного времени. В моем случае плата разработки Digilent имеет встроенный UART, поэтому я могу эффективно использовать последовательный выход в качестве консоли, чтобы все это запустить и загрузить из командной строки с минимальными усилиями.
Просто убедитесь, что для того, что вы выберете, есть готовый и хорошо протестированный компилятор. Вы же не хотите писать ОС и компилятор одновременно.
источник
http://www.osdev.org/ и http://www.osdever.net/
добро пожаловать в мир разработки ОС.
См. Также другие ссылки на документацию x86 в SO x86 tag wiki : руководства Intel и AMD, документы компилятора / ассемблера и различные руководства.
Он также предлагает использовать BOCHS или другую виртуальную среду для отладки, поскольку вы можете выполнить пошаговый загрузчик и проверить регистры.
источник
Я бы посоветовал поработать, по крайней мере, сначала, на Bochs или какой-либо другой виртуальной машине по той причине, что вы можете взять ее с собой куда угодно, ее легче отлаживать (вы можете видеть точное состояние оборудования), и если вы нужна помощь извне, они могут использовать то же самое «оборудование», что и вы.
Самый полезный совет, который у меня есть, - это войти в состояние, в котором вы можете запускать код C как можно быстрее, то есть загрузиться, настроить таблицы дескрипторов и перейти к точке, где безопасно запускать скомпилированный C. если не все ядро должно быть на C, если вы хотите оставаться в здравом уме и продолжать работать над ним. Сборка, хотя и требуется в некоторых местах, утомительна и, как правило, трудна для отладки.
источник
На самом низком уровне минимум, что операционная система должна уметь делать, - это каким-то образом управлять аппаратным обеспечением системы и каким-то образом загружать для выполнения своего рода «пользовательский код». Если вы собираетесь начать с ПК, вам нужно написать код, который он может загрузить с того или иного устройства. На старых компьютерах встроена BIOS, которая определяет, как оборудование выполняет некоторую инициализацию (по крайней мере, видео, клавиатуру и некоторую форму хранилища или загрузчика). (Обновление от октября 2017 года: на новых ПК есть прошивка EFI или UEFI ... что в значительной степени является педантичным различием; в этом обсуждении они служат тем же целям).
Итак, начните с изучения низкоуровневых деталей того, как использовать BIOS или другую прошивку в вашей целевой системе. То есть научитесь писать программу, которую BIOS может загружать и выполнять. Это в конечном итоге превратится в ваш загрузчик. Начни с малого. Просто получите программу, которая печатает: «Hello, Linus» прямо из процесса загрузки прошивки (для начала было бы неплохо с дискеты или флэш-накопителя USB ... или на жестком диске, если хотите).
Оттуда я бы порекомендовал написать очень простой последовательный драйвер ... обновить загрузчик, чтобы инициализировать какой-то последовательный порт, и начать загрузку оттуда. Затем он может выполнить код, который он использует. Оттуда напишите немного начальной загрузки, которая может записывать в другой набор блоков (мы еще не реализовали файловую систему ... даже не синтаксический анализ таблицы разделов; поэтому мы сначала будем иметь дело с необработанными диапазонами блоков на диске ).
В этот момент ваш загрузчик должен иметь возможность вытаскивать новый код по последовательной линии, выгружать его в раздел (да, реализовать какую-то обработку таблицы разделов ... соответствует ли он стандартным соглашениям ПК на этом этапе ) и выполнить его.
Оттуда вы сможете работать над гораздо более сложными функциями. На основе этой базы вы можете написать и скомпилировать новое «ядро» ... перезагрузите тестовый стенд и разверните на нем новое ядро.
(Ваш загрузчик должен принимать некоторый сигнал, такой как BREAK по последовательным линиям установления связи, как команду, чтобы пропустить загрузку и просто загрузить существующий образ; и он также должен обрабатывать некоторый тайм-аут таким образом).
Оттуда написать очень простой терминальный уровень и командную оболочку? Файловая система? Реализуйте команды для загрузки нового исполняемого содержимого, отличного от ядра (файлов или объектов какого-либо типа). И так далее.
Естественно, вы могли начать с драйвера консоли, используя клавиатуру ПК и видео (например, BIOS INT 0x16h и INT 0x10H, если я правильно помню). Однако я бы посоветовал начать с последовательного драйвера, поскольку затем вы можете автоматизировать цикл сборки / развертывания / тестирования из любой другой существующей (функциональной) системы. Поскольку ваша новая ОС будет запускаться как кросс-скомпилированный проект, вам будет важно иметь оптимизированный способ справиться с этим.
Я не знаю, как далеко вы хотите зайти в своем проекте. Достаточно впечатляющая цель - добиться «самостоятельного хостинга». Если вы можете создать простой ассемблер / компилятор, который позволит вам использовать вашу новую ОС для (пере) сборки, компоновки и загрузки рабочей версии вашей новой ОС ... то вы достигли этой цели. (Обратите внимание, что это не является обязательным требованием. Многие встроенные системы никогда не будут размещаться на собственном хостинге, и в этом нет ничего плохого).
источник
Если вы не против использования аппаратной виртуализации, есть курс (книга + лекции + программное обеспечение), который проведет вас «От Nand к тетрису». Вы создаете полную компьютерную систему полностью самостоятельно, начиная с (для этих целей атомарного и данного) электрического логического элемента NAND, вплоть до создания ОС, языка и, наконец, написания простой игры на вашем персональном компьютере.
Я считаю, что это отличная идея, и я полностью намерен в скором времени ее реализовать. Книга на удивление дешевая, и я считаю, что курс преподается в Массачусетском технологическом институте. Я не могу представить себе более сильного чувства, чем полное и исчерпывающее знание всей системы, которую вы построили с нуля.
Ссылка: http://www1.idc.ac.il/tecs/
источник
Я бы начал с малого и купил встраиваемый комплект для разработки 8086 и разработал на нем многозадачную ОС. Когда у вас будет ядро и вы познакомитесь с работой на аппаратном уровне, вы будете готовы заняться чем-то более сложным.
Создание даже клона DOS-дисплея VGA - довольно сложная задача. Детали огромны. :-)
конкретные темы.
Как мне поместить код в компьютер? Лучше всего это делать с дискеты? Может ли большинство компьютеров сделать это с USB-накопителя?
BIOS выполнит элементарную загрузку.
Какие драйверы мне нужны, и можете ли вы предложить какие-либо рекомендации по их созданию?
все, что не является прямыми операциями с процессором / памятью. Все, что не указано в справочном руководстве по ЦП.
После загрузки - что дальше? Как перейти в защищенный режим и т. Д.
Защищенный режим будет частью последовательности загрузки.
затем вы начинаете многозадачность и выясняете, как запускать процессы.
Как управлять памятью без помощи операционной системы? Я просто использую те адреса, которые хочу? Инициализация не требуется?
Верный. Вы, вероятно, захотите в конце концов разобраться с системой виртуальной памяти.
Что, несомненно, меня запутает?
не имея инструментов отладки, не имея ввода-вывода
Как сделать как командную строку O / S, так и графическую?
С горем. Найдите Windows 3.1 и Linux, в частности X windows.
На чем построена графическая операционная система? Например, как мне сделать что-то вроде командной строки со шрифтом и изображением вверху?
Посмотрите X windows.
Последний совет: изучите linux / x windows. Это не идеально, но дает понимание одного подхода. Также изучите встроенные системы.
источник
Я вижу много хороших ссылок на сайты разработки ОС, поэтому опишу другой подход:
Если вам нужен опыт реализации ОС с нуля, есть гораздо лучший выбор оборудования, чем старый ПК. С архитектурой ПК вы потратите чрезмерное количество времени на кодирование неинтересных артефактов его 30-летней истории дизайна. Например, часть проекта, относящаяся к загрузчику, вероятно, сожгла многих смелых программистов.
Например, вам понадобится один набор драйверов для чтения вашего ядра с диска и / или из сети. Затем вам понадобится код для перехода в защищенный режим. На этом этапе вам понадобится еще один набор драйверов! После этого очень небольшая часть работы, которую вы выполняете для перевода микросхемы в защищенный режим, будет передаваться. Вы хотите запустить его на другом ПК + - 4 года, и вам понадобится еще один набор драйверов.
Рассмотрите возможность начальной загрузки ARM или другого 32-разрядного «встроенного» чипа. Доступны недорогие макетные платы, или вы можете припаять свои собственные! Некоторые из них имеют встроенный Ethernet и USB. Я думаю, вы получите больше удовольствия от работы над разумной, не жесткой архитектурой и, возможно, в конечном итоге приобретете некоторые навыки, которые можно использовать повторно.
источник
Больше всего на свете, если вы хотите, чтобы это работало на реальном оборудовании, вам абсолютно необходима копия руководства вашего процессора. Руководства Intel ( http://www.intel.com/products/processor/manuals/ ) бесценны. Они охватывают все, от переключения режимов (реальный / защищенный) до управления виртуальной памятью (если вы решите зайти так далеко) и выполнения системных вызовов (если вы когда-нибудь перейдете в пользовательский режим). Что наиболее важно, они очень подробно объясняют ряд вещей, которые должны быть настроены для работы вещей, таких как TSS и регистры сегментов, которые не обсуждаются в большинстве текстов по ОС, потому что они больше связаны с концепциями более высокого уровня, чем с процессорами конкретные детали.
источник
Серии OS Разработка @ BrokenThorn может вас заинтересовать.
источник
Попробуйте прочитать код небольшой базовой ОС с открытым исходным кодом, такой как MikeOS.
В качестве альтернативы я предлагаю следующие шаги (должно быть весело!):
Вышеупомянутые шаги могут показаться глупыми для написания простой ОС, но это чертовски весело.
источник
проверьте MikeOS . Это довольно простая написанная ОС, читаемая (как в комментариях) сборка. Несмотря на то, что он довольно простой, он имеет графический интерфейс и поддерживает некоторые сети и мультимедиа.
изменить : MenuetOS является графическим. Он также написан на прямом asm, но он более сложен, чем MikeOS.
источник
У вас амбициозная цель. Но исполнение является ключевым моментом.
Большинство структурированных подходов (учебники или занятия в колледже) проведут вас через весь процесс, но они предоставляют много подробного кода, который скрывает загадочные детали выбранной вами платформы и позволяет вам сосредоточиться на общих идеях: планирование процессов, управление памятью, предотвращение взаимоблокировок, ввод-вывод и т. д.
Мой совет: сократите свои ожидания и начните с простого вопроса.
Что такое операционная система?
Ученый-компьютерщик (надеюсь) никогда не скажет, что ОС - это графический пользовательский интерфейс, или веб-браузер, или способ подключения USB-устройств, или что-либо, что пользователь действительно может увидеть или потрогать. Вместо этого ОС на самом фундаментальном уровне - это то, о чем я упоминал выше. Все они подпадают под один большой зонтик: управление ресурсами.
Операционная система - это не что иное, как программа, которая управляет аппаратными ресурсами компьютера: памятью, процессором и периферийными устройствами.
Вот простая операционная система: программа позволяет пользователю вводить программу (в шестнадцатеричном или двоичном формате), используя последовательное соединение. После того, как программа набрана, она запускает программу. Когда программа завершена, управление возвращается пользователю, где он может либо запустить программу снова, либо ввести новую.
Сделайте это на «чистой» архитектуре, такой как встроенный процессор ARM с 64 КБ памяти или около того. Вы можете закодировать это в сборке после нескольких дней изучения тонкостей ARM. И вуаля! , у вас есть операционная система.
Он делает все, что должна делать ОС:
Это дает вам строительный блок, с которого можно начать. Теперь у вас есть много вариантов. Возможно, одним из них будет разрешение загрузки двух программ в память и предоставление пользователю возможности решать, какую из них запускать следующей.
Или вы можете позволить пользователю приостановить выполнение одной программы, переключиться на другую, приостановить и переключиться обратно. Это элементарная многозадачность, хотя она полностью ручная.
Ваш выбор безграничен, но каждый - маленький шаг от того, что у вас было раньше.
Это весело, если вы не ставите перед собой слишком высокие цели!
источник
Я веду список ресурсов на StackOverflow: Как начать разработку операционной системы . Пожалуйста, добавьте к нему новые ресурсы, когда вы начнете свое приключение (я собираюсь начать :))
источник
Во многих школах есть классы ОС, которые делают многое из того, что вы описываете. Моя школа (CMU) преподавала ОС на C, и мы написали ядро, файловую систему и оболочку, а также получили код для загрузчика.
К сожалению, мне не удалось найти какой-либо исчерпывающий ресурс для этого курса (15-412) в Интернете, и со временем он эволюционировал. Но, возможно, люди могли бы публиковать ссылки на источники и задания для школ, у которых есть хорошие ресурсы в сети.
источник
Вам может понравиться это руководство под названием «Создайте свою собственную игрушечную ОС-клон UNIX», оно очень информативное и должно помочь вам на вашем пути.
Удачи.
источник
Изучите систему A2 (ранее называемую системой Оберон ), чтобы найти идеи, которые вы можете украсть. Это графическая ОС, созданная всего двумя людьми, хотя, по общему признанию, одним из них является Никлаус Вирт. Впервые выпущен примерно в 1990 году, скорость удивительно хорошая. Есть книга Гуткнехта.
источник
О низкоуровневом программировании графики это даст вам много информации: http://www.osdever.net/FreeVGA/home.htm . (Это очень интересно и для текстового режима.)
Вы поймете, что на ПК очень много непонятного: набор инструкций x86 сам по себе сложен, и когда вы получаете прямой доступ к оборудованию, может пройти довольно много времени, прежде чем вы поймете, как написать один символ на экране. .
Не беспокойтесь о дискетах и тому подобном, большую часть времени вы будете использовать эмулятор, такой как Bochs или QEmu.
источник
Возможно, вы захотите взглянуть на « Концепции операционных систем» Абрахама Зильбершатца - Понимание концепций системного программирования является фундаментальным требованием, загляните во внутреннее устройство ядра F / OSS ОС Linux * BSD и GNU / Linux , особенно более ранних версий, которые вероятно, немного более документированы.
источник
Взгляните на Minix . Изучите исходный код вместе с « Проектированием и внедрением операционных систем ». Рассмотрите возможность внесения вклада в проект. Я считаю, что Minix - действительно хорошая и многообещающая ОС, которая находится в процессе разработки. Это также хорошо финансируемый проект. Это означает, что вам могут даже заплатить за ваши взносы!
источник
Это очень просто благодаря тому, что в BIOS уже встроено множество функций ввода / вывода для изменения режима экрана, изменения цвета пикселей, записи текста на экран и многого другого. Однако он не включает поддержку файловых систем, это одна из немногих вещей, которые вы должны включить в свою ОС.
BIOS загружает первый сектор на жесткий диск и начинает выполнение кода оттуда, поэтому ваша ОС должна быть размещена с первой инструкцией в первом секторе жесткого диска.
Эта статья в Википедии должна помочь вам начать работу с прерываниями BIOS для записи текста на экран, получения клавиш с клавиатуры и прочего. https://en.wikipedia.org/wiki/BIOS_interrupt_call
Даже если вы планируете использовать C ++, я настоятельно рекомендую почитать о программировании на ассемблере, поскольку это жизненно важно для понимания того, как работает оборудование.
источник