Как я могу создать небольшую операционную систему на старом компьютере?

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

  • Я не ожидаю построить следующий Linux или Windows.

  • Я знаю, что это будет ужасно, глючит и не сработает, но это нормально.

Я хочу написать все сам, в сборке, C и (некоторые) C++.

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

Я хочу настроить один из моих старых настольных компьютеров с монитором, клавиатурой и мышью и начать работать на чистом жестком диске.

Я хочу научиться писать свой собственный загрузчик (я нашел много ресурсов по этому поводу, но для полноты, пожалуйста, добавьте еще несколько хороших), мой собственный драйвер USB (если это необходимо), драйвер CD (если это необходимо) ) и т.д. Все, с нуля.

  • Как поместить код на компьютер? Что лучше сделать с дискетой? Может ли большинство компьютеров делать это с флешки?

  • Какие драйверы мне нужны, и можете ли вы предложить какие-либо ссылки на их создание?

  • После последовательности загрузки - что тогда? Как попасть в защищенный режим и т.д.

  • Как мне управлять памятью без помощи операционной системы? Я просто использую любые адреса, которые я хочу? Нет необходимости инициализации?

  • Что я, несомненно, столкнусь с тем, что смущает меня?

  • Как сделать из нее либо командную строку O/S, либо графическую?

  • На чем построена графическая операционная система? Например, как бы я сделал что-то вроде командной строки с шрифтом и картинкой вверху?

  • Где я могу прочитать о настройке многозадачной среды? (то есть, имея две графически похожие командные строки, идущие рядом).

  • Как бы я настроить своего рода систему управления окнами? Как отобразить графику на экране после настройки простой многозадачности?

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

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

Пожалуйста, поставьте одну "тему" за ответ - например, драйверы USB, а затем, возможно, список ресурсов, на которые нужно обратить внимание и т.д.

Также, пожалуйста, не предлагайте компоновку другого O/S или уже существующего кода. Я знаю, что прочитаю много ранее существовавшего кода (например, ядро Linux или примеры ресурсов, существующие драйверы и т.д.), Но в конечном итоге я хочу написать все сам. Я знаю, что должен опираться на что-то другое, и на SO есть много других вопросов, которые я могу прочитать, если передумаю и пойду по этому пути. Но это все о том, чтобы делать все с нуля.

Любые предложения о том, как сделать это графическим? Разные режимы видео и как с ними работать и т.д?

Ответ 1

Обо всем по порядку. Читать, читать, читать, читать, читать. Вам нужно иметь четкое представление о том, как работает ОС, прежде чем вы сможете надеяться реализовать свою собственную.

Возьмите одну из книг Эндрю Таненбаума об операционных системах. Это тот, который мы использовали в моем классе ОС в колледже:

Современные операционные системы PDF

Современные операционные системы на Amazon

Несмотря на смешную обложку, это фантастическое чтение, особенно для учебника. Таненбаум действительно эксперт в этой области, и его объяснения того, как ОС работает под капотом, ясны и просты для понимания. Эта книга в основном теоретическая, но я считаю, что у него также есть книга, в которой обсуждается больше реализации. Я никогда не читал это, поэтому я не могу комментировать это.

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

Читайте о сборке x86 (при условии, что вы разрабатываете ее для машины x86). Это должно ответить на многие ваши вопросы относительно перехода между режимами работы процессора.

Если у вас есть какие-либо знания в области электроники, вам может быть легче начать с написания операционной системы для встраиваемого устройства с достаточной документацией, поскольку в целом это будет проще, чем ПК с архитектурой x86. Я всегда хотел написать свою собственную ОС, и я начинаю с написания встроенной в микроядро ОС для This Development Board от Digilent. Он может запускать процессор с мягким ядром MicroBlaze от Xilinx, который имеет очень подробную документацию. Он также получил немного оперативной памяти, флэш-памяти, светодиодов, переключателей, кнопок, VGA-выхода и т.д. Множество вещей, для которых можно поиграть с написанием простых драйверов.

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

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

Ответ 2

http://www.osdev.org/ а также http://www.osdever.net/

добро пожаловать в мир разработки ОС.

См. также другие ссылки документации x86 в SO tag wiki: руководства Intel и AMD, документы компилятора/ассемблера и различные руководства.

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

Ответ 3

Я бы предложил работать, по крайней мере сначала, на Bochs или на какой-либо другой виртуальной машине, потому что вы можете взять ее с вы, где хотите, легче отлаживать (вы можете видеть точное состояние аппаратного обеспечения), и если вам нужна внешняя отладка, они могут использовать то же самое "оборудование", что и вы.

Самый полезный совет, который у меня есть, - это войти в состояние, в котором вы можете запускать C-код как можно быстрее - т.е. загрузите, настройте таблицы дескрипторов и доберитесь до точки, где можно безопасно запускать скомпилированные C. Большинство, если не все ядро ​​должно быть на C, если вы хотите оставаться здоровым и продолжать работать над ним. Сборка, требуемая в некоторых местах, утомительна и, как правило, трудно отлаживать.

Ответ 4

На самом низком уровне минимальный уровень, который должна выполнять операционная система, - это каким-то образом управлять системным оборудованием и каким-то образом загружать исполняемый файл каким-то "кодом пользователя". Если вы собираетесь начать с ПК, вам нужно написать код, который может быть загружен им с какого-либо устройства. Старые ПК имеют BIOS в прошивке, который определяет, как аппаратное обеспечение выполняет некоторую инициализацию (по крайней мере, видео, клавиатуру и некоторую форму хранения или загрузчика). (Обновление октября 2017 года: новые ПК имеют прошивку EFI или UEFI... что в значительной степени отличается от педантизма, и те же цели для этого обсуждения).

Итак, начните с изучения низкоуровневой информации о том, как использовать BIOS или другую прошивку в вашей целевой системе. То есть, научитесь писать программу, которую BIOS может загружать и выполнять. Это в конечном итоге превратится в ваш загрузчик. Начните с малого. Просто получите программу, которая печатает: "Привет, Линус" непосредственно из процесса загрузки прошивки (на дискетах или флэш-накопителе USB будет хорошим началом... или на жестком диске, если хотите).

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

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

Оттуда вы сможете работать над гораздо более сложными функциями. С этой базы вы можете написать и скомпилировать новое "ядро"... перезагрузите свой тестовый стенд и установите новое ядро.

(Ваш загрузчик должен взять некоторый сигнал, например, BREAK по последовательным линиям связи, как команду, чтобы пропустить загрузку и просто загружать существующее изображение, а также должно обрабатывать некоторый тайм-аут таким образом).

Оттуда написать очень простой терминальный слой и командную оболочку? Файловая система? Внедрить команды для загрузки нового исполняемого контента, отличного от ядра (файлы или объекты какого-либо типа). И так далее.

Естественно, вы могли бы начать с консольного драйвера, используя клавиатуру и видео на ПК (BIOS INT 0x16h и INT 0x10H, соответственно, если я правильно помню). Однако я бы предложил начать с последовательного драйвера, так как вы можете затем автоматизировать цикл сборки/развертывания/тестирования с любой другой существующей (функциональной) системы. Поскольку ваша новая ОС начнется как кросс-скомпилированный проект, вам будет необходимо упростить процесс обработки.

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

Ответ 5

Если вы не возражаете против использования аппаратной виртуализации, есть курс (книга + лекции + программное обеспечение), в котором вы получите "От Nand до Tetris". Вы полностью создаете полную компьютерную систему из (для этих целей атомных и заданных) электрических NAND-ворот, вплоть до создания ОС, языка и, наконец, кодирования простой игры на вашей персональной машине.

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

Ссылка: http://www1.idc.ac.il/tecs/

Ответ 6

Я бы стал небольшим и приобрел встроенный набор разработчика 8086 и разработал для этого многозадачную ОС. Когда у вас есть ядро ​​и вы знакомы с работой на аппаратном уровне, вы будете готовы сделать что-то более сложное.

Создание даже VGA-дисплея DOS-клона - довольно сложная задача. Детали огромны.: -)

конкретные темы.

Как поместить код на компьютер? Лучше ли это делать с гибким диском? Может ли большинство компьютеров делать это с USB-накопителя?

BIOS выполнит начальную загрузку.


Какие драйверы мне нужны, и можете ли вы предложить какие-либо ссылки на их создание?

все, что не является прямым оператором cpu/memory. Все, что не находится непосредственно в справочном руководстве по CPU.


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

Защищенный режим будет частью последовательности загрузки.

тогда вы начинаете многозадачность и выясняете, как запускать процессы.


Как управлять памятью без помощи операционной системы? Я просто использую любые адреса, которые я хочу? Не требуется инициализация?

Правильно. Вероятно, вы захотите отсортировать систему виртуальной памяти.


Что я, без сомнения, столкнусь с этим, меня смутит?

не имеет инструментов отладки, не имея IO


Как я могу сделать это либо командной строки O/S, либо графической?

С печалью. Посмотрите Windows 3.1 и Linux, в частности на X-окна.


Что такое графический O/S? Например, как бы я сделал что-то вроде командной строки с шрифтом и картиной вверху?

Посмотрите на X-окна.


окончательный совет: изучите linux/x windows. Он не идеален, но обеспечивает понимание одного подхода. Также изучите встроенные системы.

Ответ 7

Я вижу много хороших ссылок на сайты разработки ОС, поэтому я опишу другой подход:

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

Например, вам понадобится один набор драйверов для чтения вашего ядра с диска и/или сети. Тогда вам понадобится код для перехода в защищенный режим. В этот момент вам нужен еще один набор драйверов! Очень мало работы, которую вы делаете, чтобы получить чип в защищенном режиме, будет передаваться после этой точки. Вы хотите запустить его на другом ПК + - 4 года, и вам понадобится еще один набор драйверов.

Посмотрите на загрузку ARM или другого 32-битного "встроенного" чипа. Доступны недорогие платы разработки, или вы можете припаять свои собственные! У некоторых есть встроенный Ethernet и USB. Я думаю, вам будет больше веселья, работая над здравомыслящей, не-crusty архитектурой, и, возможно, в конечном итоге с некоторыми способными к повторному использованию навыками.

Ответ 8

Более того, если вы хотите, чтобы это выполнялось на реальном оборудовании, вам абсолютно нужна копия руководства вашего процессора. Руководства Intel (http://www.intel.com/products/processor/manuals/) неоценимы. Они перебирают все из режимов переключения (реальное/защищенное) в управление виртуальной памятью (если вы решите пойти так далеко) на создание системных вызовов (если вы когда-нибудь доберетесь до пользовательского режима). Самое главное, они подробно объясняют ряд вещей, которые необходимо настроить для функционирования, например, регистров TSS и сегментов, что большинство текстов ОС не обсуждаются, потому что они больше озабочены концепций более высокого уровня, чем детали, специфичные для процессора.

Ответ 10

Попробуйте прочитать код небольшой базовой ОС с открытым исходным кодом, такой как MikeOS.

В качестве альтернативы, я предлагаю следующие шаги (должно быть весело!):

  • Напишите виртуальную машину. Определите все инструкции процессора, чтобы вы знали свою систему как внутри, так и снаружи. Интерфейс с SDL для клавиатуры, мыши, экрана, аудио доступа. Держите его простым, чтобы вы могли вписаться все в голову сразу. Он не должен быть самой современной виртуальной машиной, просто такой, которая может эмулировать функцию "реального" компьютера.
  • Напишите ассемблер для вашего процессора виртуальной машины. Помните, что этому ассемблеру не обязательно должна быть программа, написанная на языке виртуальной машины, но все, что может преобразовать ваш язык ассемблера в машинный код.
  • Определите исполняемый формат и напишите простой компоновщик.
  • Теперь у вас есть все детали, чтобы написать свою операционную систему! Запишите его на языке ассемблера, соберите его... и т.д. Вам не нужен такой сложный процесс загрузки, просто запустите свой компьютер для запуска вашей ОС.

Вышеупомянутые шаги могут казаться глупыми для написания простой ОС, но эй, это чертовски весело.

Ответ 11

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

edit: MenuetOS является графическим. Его также написано прямо asm, но его более сложный, чем MikeOS

Ответ 12

У вас есть амбициозная цель. Но выполнение является ключевым.

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

Мой совет таков: верните свои ожидания и начните с основного вопроса.

Что такое операционная система?

Ученый-программист (надеюсь) никогда не скажет, что ОС - это графический пользовательский интерфейс или веб-браузер, или способ подключения USB-устройств или что-либо, что пользователь может увидеть или коснуться. Вместо этого ОС на самом фундаментальном уровне - это те вещи, о которых я говорил выше. Все они подпадают под один большой зонт: управление ресурсами.

Операционная система - это не что иное, как программа, которая управляет аппаратными ресурсами компьютера: памятью, процессором и периферийными устройствами.

Здесь простая операционная система: программа позволяет пользователю вводить программу (в шестнадцатеричной или двоичной) с использованием последовательного соединения. После того, как программа была введена, она запускает программу. Когда программа завершена, управление возвращается пользователю, где они могут либо запустить программу, либо ввести новый.

Сделайте это на "чистой" архитектуре, такой как встроенный процессор ARM с 64 КБ памяти или так далее. Вы можете запрограммировать это в сборке через несколько дней после обучения входов и выходов ARM. И voila!, у вас есть операционная система.

Он делает все, что должна делать ОС:

  • Он управляет памятью, не позволяя пользователю перезаписывать сама ОС.
  • Он планирует запуск одного процесса.
  • Он обрабатывает ввод/вывод для одного последовательного периферийного устройства.

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

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

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

Это весело, если вы не слишком высоко оцениваете свои достопримечательности!

Ответ 14

Во многих школах есть классы ОС, которые многое делают из того, что вы описываете. Моя школа (CMU) преподавала ОС на C, и мы написали ядро, файловую систему и оболочку и получили код для загрузчика.

К сожалению, я не смог найти какой-либо окончательный ресурс для этого курса (15-412) в Интернете, и он эволюционировал с течением времени. Но, возможно, люди могут размещать ссылки на источники и задания для школ, которые имеют хорошие ресурсы в Интернете.

Ответ 15

Вам может понравиться этот учебник под названием "Сверните свою игрушку UNIX-клон OS", ее очень проницательный и должен помочь вам на вашем пути.

Удачи.

Ответ 16

Изучите A2 System (ранее называемую системой Oberon) для идей, которые вы можете украсть. Это графическая ОС, построенная всего двумя людьми, хотя, по общему признанию, это Никлаус Вирт. Первый выпущен около 1990 года, и скорость поразительно хороша. Существует книга Гуткнехта.

Ответ 17

Возможно, вы захотите взглянуть на " Концепции операционных систем" Абрахама Силбершаца - Понимание концепций системного программирования является фундаментальным требованием, взгляните на внутреннее ядро F/OSS операционных систем linux * BSD и GNU/Linux, особенно в более ранних версиях, которые вероятно, немного более задокументированы. alt text alt text

Ответ 18

О низкоуровневом графическом программировании это даст вам много информации: http://www.osdever.net/FreeVGA/home.htm. (Это очень интересно для текстового режима.)

Что я, без сомнения, столкнусь с этим, меня смутит?

Вы поймете, что на ПК есть очень много непонятного материала: набор команд x86 сам по себе сложный, и когда вы получаете прямой доступ к оборудованию, может потребоваться довольно много времени, прежде чем вы поймете, как написать одиночный символ на экране.

Не беспокойтесь о дискете и т.д., большую часть времени вы будете использовать эмулятор, такой как Bochs или QEmu.

Ответ 19

Посмотрите на Minix. Изучите исходный код вместе с " Проектирование и реализация операционных систем ". Подумайте о внесении вклада в проект. Я думаю, что Minix - действительно хорошая и многообещающая ОС в процессе создания. Это также хорошо финансируемый проект. Это означает, что вам могут даже заплатить за ваши взносы!

Ответ 20

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

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

В этой статье в Википедии вы должны начать с прерываний BIOS для ввода текста на экран, получения ключей с клавиатуры и других вещей. https://en.wikipedia.org/wiki/BIOS_interrupt_call

Даже если вы планируете использовать С++, я бы настоятельно рекомендовал читать на ассемблере, так как очень важно понять, как работает оборудование.