Школа ассемблера: разработка операционной системы. Как создать операционную систему.

Как создать операционную систему - ↑ Удаление эталонной Windows на VHD-диске Пишем ядро с поддержкой клавиатуры и экрана ↑ Захват эталонной Windows в файл WIM или ESD Настройка загрузки: выбор ОС по умолчанию Редактирование ISO - образа Windows 10
Содержание
  1. Как создать свою сборку Windows с помощью программы Dism++
  2. ↑ Создание виртуального диска VHD
  3. ↑ Установка эталонной Windows на VHD-диск
  4. Работа со стеком
  5. Ядро операционной системы
  6. Исполнение сторонних программ
  7. Составляющие операционной системы
  8. Ядро (англ. kernel)
  9. Системные программы
  10. Пользовательские программы
  11. Что необходимо знать
  12. Изучение информатики
  13. Изучение программирования
  14. Изучение языков программирования
  15. Язык ассемблера для x86
  16. Язык Cи
  17. Как самостоятельно сделать свою сборку ОС Windows 10, 8 подробных шагов
  18. Создание своей собственной сборки Windows 10
  19. Подготовительный этап
  20. Создание образа в формате ESD
  21. Нюансы с активацией
  22. Что такое Linux From Scratch?
  23. Как сделать свою собственную ОС Linux
  24. Шаг 1: Разметка дисков
  25. Шаг 2: Скомпилируйте и установите базовую систему
  26. Шаг 3. Установите рабочий стол, приложения и все остальное
  27. Стоит ли попробовать Linux From Scratch?
  28. GRUB и мультизагрузка
  29. Собираем ядро
  30. Настраиваем GRUB и запускаем ядро
  31. GRUB 2

Затем адрес строки заносится в регистр SI и вызывается функция load_file. Но подумайте об этом — мы еще не разработали эту функцию! Да, это так, но реализация может быть найдена в другом файле исходного кода под названием disk.asm, на который мы ссылаемся.

Как создать свою сборку Windows с помощью программы Dism++

Здравствуйте, друзья. Мы продолжаем обзор возможностей замечательной программы, маст хэв для сисадминов и энтузиастов — Dism++. Эта статья является своего рода кульминацией серии постов об этом программном обеспечении: В ней мы узнаем, как создать собственную Windows с помощью Dism++. А создание собственной Windows является простым и понятным. Нам не нужна виртуальная машина для создания образа основной системы, не нужен установочный или live-диск для загрузки образа, не нужна командная строка. Мы будем использовать Dism++ для создания главного образа Windows, который будет создан в VHD-файле, и его настройки. С помощью того же Dism++ мы его чистим, оптимизируем и приводим в актуальное состояние. Снова используя Dism++, мы записываем образ в файл WIM или ESD, а затем сжимаем его в установочный файл ISO.

Примечания: Если вы настоящий гурман, когда дело доходит до создания собственных сборок Windows, и ищете идеальный способ их создания, ознакомьтесь со статьями здесь, в которых обобщены различные способы создания собственных пользовательских сборок. Или вы можете использовать тег «Пользовательские сборки Windows».

Итак, мы хотим создать собственные пользовательские сборки Windows 7, 8.1 или 10. Для этого нам необходимо:

— Установочный образ ISO нужной нам версии и версии Windows,

— Управление жестким диском.

↑ Создание виртуального диска VHD

Чтобы создать пользовательскую сборку Windows, нам нужно установить новую операционную систему. И на этой основе создается эталонный образ Windows — система без профиля пользователя, но с необходимыми настройками, установленными системными компонентами, обновлениями и программами. А это эталонный образ, который мы создадим на виртуальном VHD-диске. Нажимаем Win+R, вводим:

И запустите «Управление системными дисками». Там нажимаем Action и затем Create Virtual Hard Disk.

Укажите расположение файла VHD виртуального жесткого диска, его размер и тип. Я установил небольшой размер в 30 ГБ и выбрал динамический тип. Мы удалим виртуальный жесткий диск после создания нашей сборки, поэтому все эти настройки не имеют большого значения.

После создания виртуального жесткого диска инициализируйте его.

Выберите стиль разметки, соответствующий физическим дискам вашего компьютера, в моем случае это GPT.

Создайте стандартный раздел NTFS на пустом пространстве инициализированного виртуального жесткого диска.

В результате у нас должен появиться дополнительный жесткий диск в системе с одним разделом для справочника Windows.

↑ Установка эталонной Windows на VHD-диск

Теперь нам нужно установить Windows на этот VHD-диск, который мы адаптируем к нашему эталонному образу. Запустите программу Dism++. Нажмите на «Файл», а затем на «Применить изображение».

В разделе «Введите путь к файлу образа» с помощью кнопки «Поиск» введите путь к ISO-образу установки Windows. Например, я буду использовать установочный ISO ISO Windows 8.1 Build AIO Сергея Стрелеца, который основан на чистом образе Microsoft с удаленными приложениями Modern UI. В столбце Система введите версию Windows, которая будет установлена.

Затем в последнем столбце укажите раздел, который вы создали на виртуальном диске. Затем нажмите кнопку «Ок». Важно: Друзья, если вы хотите установить основной образ Windows не на VHD-файл, а на другой раздел жесткого диска, также активируйте флажок «Форматировать», если этот раздел содержит данные.

Затем примите регистрацию новой системы в меню загрузки. Если у вас несколько дисков загрузчика, нажмите «Еще» и укажите нужный диск загрузчика и раздел для Dism++.

Затем дождитесь завершения процесса копирования новых файлов Windows. Вы можете следить за ходом работы в верхней части окна, в новом системном блоке.

После завершения нажмите «OK».

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

Укажите расположение файла VHD виртуального жесткого диска, его размер и тип. Я установил небольшой размер в 30 ГБ и выбрал динамический тип. Мы удалим виртуальный жесткий диск после создания нашей сборки, поэтому все эти настройки не имеют большого значения.

Работа со стеком

Далее нам нужно использовать те же команды, что и в предыдущей статье, для инициализации регистров и стека, а также команду cld (что означает «clear direction») для установки флага направления для определенных команд, таких как команда lodsb, которая при выполнении увеличивает значение в регистре SI вместо того, чтобы уменьшать его.

Затем адрес строки заносится в регистр SI и вызывается функция load_file. Но подумайте об этом — мы еще не разработали эту функцию! Да, это так, но реализация может быть найдена в другом файле исходного кода под названием disk.asm, на который мы ссылаемся.

Файловая система FAT12, используемая на дискетах в формате MS-DOS, является одной из самых простых файловых систем, но она также требует много кода для работы с ее содержимым. Подпрограмма load_file занимает около 200 строк и не упоминается здесь, потому что мы обсуждаем процесс разработки операционной системы, а не драйвера для конкретной файловой системы, поэтому не стоит тратить место на страницах журнала таким образом. В общем, мы связываем исходный файл disk.asm непосредственно перед концом текущего исходного файла и можем забыть о нем. (Если вас все еще интересует структура файловой системы FAT12, вы можете прочитать отличный отчет на http://tinyurl.com/fat12spec, а затем посмотреть исходный файл disk.asm — код там хорошо прокомментирован).

В любом случае, подпрограмма load_file загружает двоичный код из файла, названного в регистре SI со смещением 0, в секцию 2000, после чего мы переходим в начало файла для выполнения. Вот и все — ядро операционной системы загружено, и загрузчик сделал свое дело!

Вы могли заметить, что в нашем коде в качестве имени ядра операционной системы используется MYKERNELBIN вместо MYKERNEL.BIN, что соответствует схеме именования 8+3, используемой на дискетах в DOS. Файловая система FAT12 использует внутреннее представление имени файла, и мы экономим место, используя имя файла, которое гарантирует, что подпрограмме load_file не придется использовать механизм поиска символов точки и преобразовывать имя файла во внутреннее представление файловой системы.

После строки с инструкцией по линковке файла исходного кода disk.asm идут две строки, в которых двоичный код загрузчика заполняется нулями до 512 байт и метка конца двоичного кода (как упоминалось в предыдущей статье). В конце кода находится тег «buffer», который используется подпрограммой load_file. Как правило, подпрограмме load_file требуется свободное пространство для выполнения некоторых промежуточных шагов по поиску файла на диске, и у нас достаточно свободного места после загрузки загрузчика, поэтому мы размещаем буфер здесь.

Это интересно:  AMD Ryzen 5 5600x или Intel Core i5-12400F. Что лучше core i5 или ryzen 5.

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

Теперь нам нужно создать образ виртуального диска в формате MS-DOS и вставить двоичный код загрузчика в первые 512 байт с помощью следующих команд:

На этом процесс разработки загрузчика можно считать завершенным! Теперь у нас есть образ загрузочного диска, который мы можем использовать для загрузки и запуска двоичного кода ядра нашей операционной системы из файла mykernel.bin. Далее следует более интересная часть работы: разработка самого ядра операционной системы.

Ядро операционной системы

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

Перед просмотром кода обратите внимание на последнюю строку, предписывающую вам связать файл исходного кода lib.asm, который вы также можете найти в файле asmschool.zip с нашего сайта. Это библиотека полезных подпрограмм для экрана, клавиатуры, строк и дисков, которые вы также можете использовать — в данном случае мы включаем этот исходный файл в конец основного исходного файла ядра операционной системы, чтобы сделать последний как можно более компактным и красивым. Более подробную информацию обо всех доступных подпрограммах см. в разделе «Подпрограммы библиотеки lib.asm».

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

Затем в коде появляется метка, соответствующая началу цикла. Сначала мы используем подпрограмму библиотеки lib.asm, а именно lib_print_string, для печати приветствия. Байты 13 и 10 перед текстом приветствия являются символами перевода строки, поэтому текст приветствия выводится не сразу после окончания программы, а всегда с новой строки.

Далее мы используем другую подпрограмму из библиотеки lib.asm под названием lib_input_string, которая принимает символы, введенные пользователем с клавиатуры, и сохраняет их в буфере, указатель которого находится в регистре SI. В нашем случае буфер объявляется в конце кода ядра операционной системы следующим образом:

Эта инструкция позволяет нам создать 256-символьный буфер, заполненный нулями — он должен быть достаточно большим, чтобы вместить команды такой простой операционной системы, как наша!

Далее мы выполняем проверку пользовательского ввода. Если первый байт буфера user_input равен нулю, пользователь просто нажал клавишу Enter без ввода команды; помните, что все строки заканчиваются нулевыми символами. Поэтому в данном случае мы должны просто перейти к началу цикла и снова вывести приветственное сообщение. Однако, если пользователь вводит команду, мы должны сначала проверить, что пользователь ввел команду ls. До сих пор в программах на языке ассемблера вы видели только сравнение отдельных байтов, но помните, что мы также можем сравнивать двухбайтовые значения или машинные слова. В этом коде первое машинное слово из буфера пользовательского ввода сравнивается с машинным словом, соответствующим строке ls, и если они идентичны, мы переходим к следующему блоку кода. В этом блоке кода мы используем другую подпрограмму из библиотеки lib.asm для получения списка файлов на диске, разделенных запятыми (которые должны храниться в буфере file_list), отображения этого списка и возврата в цикл для обработки пользовательского ввода.

Исполнение сторонних программ

Если пользователь не набирает ls, мы предполагаем, что пользователь набрал имя программы с диска, поэтому имеет смысл попытаться загрузить ее. Наша библиотека lib.asm содержит реализацию полезной подпрограммы lib_load_file, которая анализирует таблицы файловой системы FAT12 на диске: Он принимает указатель на начало строки с именем файла через регистр AX и значение смещения для загрузки двоичного кода из файла программы через регистр CX. Мы уже используем регистр SI для хранения указателя на строку с пользовательским вводом, поэтому мы копируем этот указатель в регистр AX, а затем помещаем значение 32768, которое используется в качестве смещения для загрузки двоичного кода из файла программы, в регистр CX.

Но почему мы используем это значение в качестве смещения для загрузки двоичного кода из файла программы? Что ж, это лишь один из вариантов распределения памяти для нашей операционной системы. Поскольку мы работаем на одном разделе размером 64 КБ и двоичный код ядра загружается в позиции 0, нам нужно использовать первые 32 КБ памяти для данных ядра и оставшиеся 32 КБ для загружаемых данных программы. Таким образом, смещение 32768 является серединой нашего сегмента и позволяет нам выделить достаточно оперативной памяти как для ядра операционной системы, так и для загруженных программ.

Затем подпрограмма lib_load_file выполняет очень важную функцию: Если он не может найти файл с определенным именем на диске или по какой-то причине не может прочитать его с диска, он просто прерывается и устанавливает специальный транспортный флаг. Это флаг состояния процессора, который устанавливается во время определенных математических операций и в данный момент не должен нас интересовать, но мы можем обнаружить наличие этого флага для принятия быстрых решений. Когда lib_load_asm устанавливает флаг переноса, мы используем инструкцию jc (jump if carry) для перехода к блоку кода, где мы отбрасываем сообщение об ошибке и возвращаемся в начало цикла для обработки пользовательского ввода.

Если флаг переноса не активирован, можно сделать вывод, что подпрограмма lib_load_asm успешно загрузила двоичный код из файла программы в оперативную память по адресу 32768. Все, что нам нужно сделать в этом случае, это начать выполнение двоичного кода, загруженного по этому адресу, т.е. выполнить пользовательскую программу! И после использования команды ret в этой программе (для возврата к коду вызова) нам остается только вернуться в цикл обработки ввода пользователя. Таким образом, мы создали операционную систему: Он состоит из простых механизмов для разбора команд и загрузки программ, реализованных примерно в 40 строках ассемблерного кода, хотя и с большой помощью подпрограмм библиотеки lib.asm.

Для сборки основного кода операционной системы следует использовать следующую команду:

Затем мы должны каким-то образом добавить файл mykernel.bin в файл образа диска. Если вы знакомы с техникой монтирования образов дисков через шлейфовые устройства, вы можете использовать ее для доступа к содержимому образа диска floppy.img, но есть более простой способ, а именно GNU Mtools ( www.gnu.org/software/mtools ). Это коллекция дисковых утилит, использующих файловые системы MS-DOS/FAT12. Он доступен в репозиториях программных пакетов всех основных дистрибутивов Linux, поэтому для установки программных пакетов в вашем дистрибутиве достаточно использовать apt-get, yum, pacman или другую утилиту.

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

Составляющие операционной системы

Операционная система состоит из двух основных компонентов:

Ядро (англ. kernel)

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

Это интересно:  Телевизоры Samsung The Frame по состоянию на 2022 год. Телевизор самсунг как картина.

Системные программы

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

Пользовательские программы

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

Что необходимо знать

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

  • Базовое понимание компьютерных наук (компьютерной инженерии),
  • Теория и опыт в программировании,
  • знание языков программирования высокого и низкого уровня.

Изучение информатики

Разработка операционных систем — это не то же самое, что, например, разработка веб-сайтов. Вы не сможете быстро и легко освоить основы. Сначала вам нужно приобрести прочную основу в информатике и только потом переходить к другим предметам.

Coursera: Computer Science 101 — это курс, подходящий для тех, кто только начинает изучать информатику и программирование. Если у вас уже есть базовые знания по информатике, вы можете пропустить этот курс и продолжить изучение следующего курса.

Udacity: Intro to Computer Science использует веб-разработку в качестве подхода к преподаванию информатики. Хотя курс не ориентирован на разработку операционных систем, он обеспечивает прочную основу в программировании.

edX: Intro to Computer Science — самый полный и основательный курс в этом списке. Однако она совершенно бесплатна. Курс был разработан в Гарвардском университете. Вы изучите алгоритмы, структуры данных, управление объектами, разработку программного обеспечения и другие языки программирования, такие как C, PHP и JavaScript.

Подборка книг для самостоятельного изучения информатики.

Изучение программирования

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

Udacity: Процесс разработки программного обеспечения — отличный курс для тех, кто еще не участвовал в крупных проектах. Вы получите описание рабочего процесса и инструментов (например, Git), а также как создать интегрированную среду разработки.

Изучение языков программирования

Для разработки операционной системы необходимо знать как минимум два языка программирования:

  • Низкоуровневый язык ассемблера,
  • Низкоуровневый язык ассемблера; высокоуровневый язык программирования.

Первый используется для работы непосредственно с процессором. Процессор «понимает» только машинный код, и для каждого типа процессора существует только один соответствующий язык. Одной из самых популярных процессорных архитектур является архитектура x86. Он был разработан компанией Intel и в настоящее время используется многими производителями компьютерного оборудования, включая AMD. По этой причине данная статья посвящена архитектуре x86.

Языки программирования высокого уровня работают последовательно на нескольких архитектурах одновременно. Самый популярный из этих языков — C. На этом языке написаны в основном операционные системы. Однако это не означает, что он является единственным языком. Также могут быть доступны языки программирования более высокого уровня, такие как C++ и Python.

Примечание по переводу. Есть пример написания игровых операционных систем на C#. Cosmos — это своего рода разработчик операционной системы. В этой статье на практическом примере показано, как написать систему в несколько десятков строк.

Язык ассемблера для x86

«x86 assembly guide» — неплохо для первого изучения ассемблера. Хотя эта статья слишком коротка для полного курса, она содержит все необходимое для углубленного изучения.

Книга «Программирование с нуля» Джонатана Бартлетта является одной из самых важных книг для изучения ассемблера. В нем основы языка программирования подкрепляются основами информатики.

Еще одна отличная книга для изучения языка ассемблера — «Искусство языка ассемблера» Рэнди Хайда. Первоначально книга была написана специально для курсов, которые автор читал в Калифорнийском политехническом университете и Калифорнийском университете в Риверсайде. В середине 1990-х годов эта книга считалась окончательным трудом по данной теме.

Если приведенные выше материалы не удовлетворяют вашим потребностям, вот еще несколько отличных книг:

  • «Ассемблер шаг за шагом: программирование в Linux» Джеффа Дантеманна,
  • «Современное программирование на ассемблере X86» Даниэля Касварма.

Язык Cи

Как уже упоминалось, существует несколько языков высокого уровня для программирования операционных систем. Самым популярным, однако, является C.

Вы можете начать изучать этот язык здесь. Этот ресурс познакомит вас с основными понятиями и подготовит к более сложным задачам.

«Learn C the Hard Way» — так называется другая книга. Помимо обычной теории, она содержит множество практических решений. Эта книга охватывает все аспекты языка.

В качестве альтернативы вы можете выбрать одну из этих книг:

  • «Язык программирования Си» Кернигана и Ричи,
  • «Абсолютное руководство для начинающих по программированию на языке Си» Перри и Миллера.

После установки соответствующего пакета программного обеспечения необходимо выполнить следующую команду, чтобы добавить файл mykernel.bin в файл образа диска floppy.img:

Как самостоятельно сделать свою сборку ОС Windows 10, 8 подробных шагов

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

Самостоятельная сборка систем экономит время и усилия при установке операционной системы. Количество положительных и отрицательных моментов зависит от мастерства и профессионализма пользователя.

Преимущества систем, изготовленных по индивидуальному заказу, включают:

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

Bild_1

Проприетарные структуры также имеют недостатки

  • созданный дистрибутив занимает больше места, чем исходная операционная система,
  • процесс установки занимает больше времени,
  • Нестабильность системы из-за присутствия драйвера или службы, что влияет на трудоемкость установки,
  • Ошибки в реестре, важном компоненте системы; неправильные записи приводят к нестабильной работе Windows и критическим ошибкам.

Если вы самостоятельно создаете модифицированную сборку Windows 10, вам следует знать, что перед запуском программы лучше всего параллельно создать резервную копию системного раздела.

Bild_2

Создание своей собственной сборки Windows 10

Процесс анализа полезности осуществляется в несколько этапов. Этот метод должен использоваться только опытными пользователями.

Подготовительный этап

Во-первых, требуется подлинная версия Windows, которую можно загрузить с официального сайта Microsoft. Дистрибутив сохраняется на съемном носителе или в виде ISO-файла путем выбора соответствующей версии утилиты.

Bild_3

Необходимо выполнить следующие действия:

Bild_4

  • Тип: C:\Windows\System32\Sysprep.exe.
  • «Перейти к экрану приветствия системы», поставьте галочку напротив пункта «Подготовить к использованию».
  • Выберите «Выключить» в нижней части.
  • Подтвердите действие, нажав «Ok».

Bild_5

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

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

Bild_6

Создание образа в формате ESD

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

Чтобы выполнить операцию, необходимо сделать следующее:

  • Подключите внешний диск и загрузитесь с него.
  • Одновременно нажмите Shift+10.

Bild_7

Bild_8

  • Сохраните диск C, введя: Dism /Capture-Image /ImageFile:I:\install.esd /CaptureDir:C:\ /Name:Windows.

Bild_9

  • Затем выключите компьютер, на котором было создано изображение.

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

Это интересно:  Как выбрать робот-пылесос. На что обратить внимание при выборе робота пылесоса.

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

Bild_10

Нюансы с активацией

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

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

Что такое Linux From Scratch?

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

Linux From Scratch — это не просто очередной дистрибутив с минимальным набором инструментов. LFS — это фактически только документация, то есть все, что вы делаете, буквально построено из исходного кода проекта, о котором идет речь.

Другими словами, вы можете использовать документацию LFS для загрузки и компиляции исходного кода ядра Linux прямо с сайта. Затем переходите к следующему компоненту и работайте по нарастающей, пока наконец не создадите операционную систему или, по крайней мере, ту операционную систему, которая вам нужна.

Как сделать свою собственную ОС Linux

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

Однако нет необходимости устанавливать временный дистрибутив. Вы можете загрузить Linux с USB-накопителя и использовать его для любых нужд.

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

Шаг 1: Разметка дисков

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

Вы можете создать эти разделы с помощью вашего любимого инструмента разметки, например, GParted. Если вы используете стандартные версии Ubuntu или Fedora, у вас, вероятно, уже установлены диски GNOME. Или вы можете использовать инструмент командной строки, такой как fdisk, который доступен независимо от выбранного вами дистрибутива.

Вы можете установить систему рядом с существующей операционной системой, но помните, что двойная загрузка сопряжена с риском. Linux From Scratch является довольно сложной системой. Вы можете не беспокоиться об этой дополнительной сложности.

Шаг 2: Скомпилируйте и установите базовую систему

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

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

Обратите внимание, что Linux From Scratch имеет иное понятие «потребностей», чем ваш стандартный дистрибутив, который поставляется с множеством фоновых служб, таких как принтеры, аудиосерверы и брандмауэры. Вы можете установить столько всего, сколько захотите, но об этом позже.

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

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

Шаг 3. Установите рабочий стол, приложения и все остальное

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

Стоит ли попробовать Linux From Scratch?

Установка операционной системы LFS, безусловно, займет некоторое время, поскольку компиляция программного обеспечения — процесс не быстрый. Если вы еще не пробовали работать в Linux или не знакомы с терминалом, возможно, вам стоит сначала попробовать что-нибудь другое, прежде чем углубляться в работу.

Если вы все же хотите поэкспериментировать с Linux From Scratch, попробуйте его в безопасном, изолированном месте, таком как виртуальная машина или виртуальный компьютер, чтобы случайно не уничтожить ценные данные. Тогда, во что бы то ни стало, выясните это. Есть так много бесценных знаний, которые можно получить только через практику.

В результате компоновщик объединяет все текстовые сегменты всех объектных файлов в один текстовый сегмент исполняемого файла и помещает его по адресу, указанному в счетчике позиций. Сегмент кода нашего исполняемого файла начинается по адресу 0x100000.

GRUB и мультизагрузка

Теперь все наши файлы готовы к сборке ядра. Но поскольку мы собираемся загружать ядро с помощью GRUB, остается еще один шаг.

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

Согласно этой спецификации, ядро может содержать мультизагрузочный заголовок в первых 8 килобайтах, который должен содержать три поля:

  • magic — содержит «магическое» число 0x1BADB002, которое идентифицирует заголовок,
  • flags — это поле для нас не важно, мы можем оставить его пустым,
  • контрольная сумма — контрольная сумма должна равняться нулю, когда вы добавляете ее к полям magic и flags.

Файл kernel.asm теперь выглядит следующим образом

kernel.asm
Команда dd устанавливает двойное слово в 4 байта.

Собираем ядро

Теперь мы готовы создать наш объектный файл из файлов kernel.asm и kernel.c и связать его с нашим скриптом. Напишите в консоли:

Эта команда заставляет ассемблер создать файл kasm.o в 32-битном формате ELF. Теперь настала очередь ССАГПЗ:

Параметр — c означает, что файл не нужно компоновать после компиляции. Мы сделаем это сами:

Эта команда запускает компоновщик с нашим скриптом и создает исполняемый файл под названием kernel .

Взлом ядра лучше всего проводить в виртуальной среде. Чтобы запустить ядро в QEMU вместо GRUB, используйте qemu — system — i386 — kernel kernel .

Настраиваем GRUB и запускаем ядро

GRUB требует, чтобы имя файла ядра следовало за именем ядра -. < версия >. Поэтому переименуйте файл — я назову свое ядро — 701.

Теперь поместите ядро в /boot, для чего вам понадобятся права суперпользователя.

В конфигурационный файл GRUB grub.cfg нужно добавить что-то вроде следующего:

Не забудьте удалить политику скрытого меню, если она присутствует.

GRUB 2

Для запуска ядра, созданного нами в GRUB 2, которое используется по умолчанию в новых дистрибутивах, ваша конфигурация должна выглядеть следующим образом:

Спасибо Рубену Лагуне за это дополнение.

создание ядра операционной системы

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

Это ваше ядро!

Оцените статью
levsha71.ru