#: Train-OS тренировочная сессия для создания операционной системы. Начиная с нуля, используя только ресурсы от AMD и Intel .
Все еще на стадии Альфа
Этот репозиторий еще не отполирован и все еще должен рассматриваться на альфа -стадии. Код должен собирать и работать, но текстовые сообщения - это лишь первый черновик, который я отметил, кроме того, когда я кодировал и исследовал.
Что отличается от других уроков?
Есть много учебных пособий, и большая часть материала, который я представлю, также охватывается там. Так зачем беспокоиться? Особенно мне нравится и вдохновил эти:
- Фил Тодо: Ссылка
- Intermezzos: Todo: Link
Что отличается в этой версии? Когда я узнаю новые вещи, у меня часто возникает ощущение, что я не знаю/узнаю , как я мог бы сделать то, что я только что сделал самостоятельно в следующий раз. Я не знаю, так ли я учусь, или просто типичная вещь, которая легко пропущена при написании учебных пособий. Вот несколько моментов, о которых я задаюсь регулярно, и что я хочу обратиться (я, вероятно, упущу другие важные вещи, чтобы восполнить это)
- Предоставьте некоторую более подробную информацию о том, какие пункты просто являются соглашениями , которые были согласованы, что является стандартом, что является специфичным для архитектуры. Я до сих пор помню, когда я впервые начал изучать программирование в подростковом возрасте, я был похож на «Uuhh ... как компьютер знает, что функцию нужно называться первым», и ни один из моих друзей или учителей не является новеньком. Это была просто "магия". Меня это беспокоит , я хочу убедиться, откуда что -то происходит ...
- Укажите на стандарт и работайте оттуда. Я не представляю готового решения, которое вы только что скопируете. Мы принимаем стандарт и на самом деле смотрим . Так же, как нам нужно было бы, если бы мы хотели запустить код на коре, скажем, кора руки вместо вашей машины x86_64. Или, в сфере обрамленного по-другому, что, если бы мы были первыми, кто написал учебное пособие, как бы мы запустили этот загрузчик, прерывания настроены или в первую очередь в 64-битный режим?
- Делай что -то дважды. Сначала я пойду, это помогает понять, что происходит, а затем мы используем инструменты, чтобы не выполнять эту наземную работу каждый раз.
- Промежуточные шаги и «контрольно -пропускные пункты»
- Сначала дайте контур -> увидеть более широкую картину
- Приведите примеры в реальном коде -> например, что первая корневая корзина на самом деле точно так же, как Linux строится
- Представьте альтернативы/выбор для каждой
dependency , которую мы начинаем использовать. Для меня это облом, если я хочу следовать учебному пособию, и многие внешние библиотеки делают магию, которую я на самом деле хотел изучить.
Контур
Грубый план того, что я хочу сделать. Надеюсь, в более или менее хронологическом порядке. Дело в том, что мы могли бы сделать так много, что на самом деле довольно сложно выбрать путь.
Во -первых, я хотел бы лучше понять процесс загрузки. То, что произойдет до того, как загрузчик запрыгнет. На самом деле, катание на своем собственном загрузке (ссылка на OSDEV) сама по себе является огромной задачей.
Мой план состоит в том, чтобы немного изучить раннюю фазу процесса загрузки. Цель этого - понять и оценить, что для нас делает загрузчик. В конце я хотел бы иметь грубое понимание различных режимов процессора, то, что они предлагают и как переключиться на 32-разрядный защищенный режим. Конкретная цель - иметь возможность переключиться на защищенный режим и печатать Hello World! на экран. Все реализовано в сборке и без использования загрузчика.
После этого я планирую переключиться и использовать Grub в качестве загрузчика. И продолжить оттуда.
TL; DR
- Напишите минимальное загрузочное изображение.
- Bootloader, который печатает
Hello World в 16-битном реальном режиме. - Вручную переключитесь на защищенный 32-битный режим и печатайте
Hello World . - Вручную переключитесь на длинный режим 64 байна
- Используйте Grub в качестве загрузчика и печати
Hello World . - Переключитесь в Long Mode (снова).
- Прыгайте в
C , печати Hello World . - Куча
- Реализовать VGA Video Driver.
- Прерывания (часть 1) - Расскажите CPU, где найти обработчиков, в ASM
- Прерывания (часть 2) - Переместите код с 10. на C
- Реализуйте лучшие обработчики
- Отладка
- Обрабатывать прерывания/исключения
- Реализовать пейджинг памяти.
- Пересмотреть ядро
неуточнен:
- рефакторинг?
- Утилиты (MEMSET?)
Позже ...
- файловая система
- процессы
- планирование
- системные вызовы
- Исследуйте стек, провоцируйте переполнение и исключения стека.
- Связаться с GDB через UART (для отладки и встроенного предварительного просмотра)
- Кросс-компиляция некоторых (или многих) деталей в процессор ARM. (У меня есть STM и Infineon Board, лежащая вокруг неиспользованных)
Пререквизиты?
Никто. Серьезно, не бойтесь. Весь смысл этого урока состоит в том, чтобы разработать все необходимые знания с нуля. Я предполагаю только одно условие, и это то, что вы можете программировать прилично. Под приличным я имею в виду, что вы, по крайней мере, слышали о стеке и куче и можете быть продуктивным на некотором языке. Я думаю, этого должно быть достаточно. В конце концов, мы не пытаемся разработать здесь основную ОС следующего поколения, мы возимся на уровне хобби.
И я могу вас заверить: даже если вы никогда больше не будете касаться этого кода и никогда не напишете ОС. Опыт изменит ваше понимание систем, над которыми вы работаете глубоко . Знания, полученные в результате развития на уровне ядра, распространяются как семена на протяжении всей вашей карьеры, и понимание окажется полезным в самые неожиданные моменты.
Скретч (неорганизованные идеи с этого момента)
Идеи
- Что делает процессор, если вы поставите инструкции после первых 512 байтов? Они казнены? (ЦП находится в 16-битном реальном режиме)
Контур
- Bootload -> два варианта бросают свой собственный или используйте существующие, например, Grub.
- 16 -битный режим
- Ввод 32 -битный защищенный режим
- Ввод 64 -битный длинный режим
- Введите в
- Написать модуль управления памятью
Цикл 0 - Окружающая среда и межкомпиляция
- Вы можете пропустить некоторые шаги. Нам не понадобится компиляция Cross, прежде чем мы начнем писать C -код.
- Начните строить свой инструмент где -нибудь до дома
- Убедитесь, что объем переменных среды правильный
- Ошибки, такие как «нет разрешения на создание каталога
/usr/lib/i686-elf », указывают на то, что $PREFIX неправильно установлен. - Мы не получаем «настоящий» процессор Barebones, перед нами все еще есть биография. Он инициализирует процессор и передает нам процессор в реальном режиме.
Цикл 0 - загрузчик
Ресурсы
- Документация NASM https://www.nasm.us/xdoc/2.14.02/html/nasmdoc3.html
- Руководства Intel