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

Dism++ — это программа комплексной очистки, оптимизации и улучшения всех образов системы — как установленных на жестком диске, т.е. рабочих систем, так и смонтированных для обработки дистрибутива. Как мы можем настроить окна отчетов с помощью программы?

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

Здравствуйте, друзья. Мы продолжаем обзор возможностей замечательной программы, маст хэв для системных администраторов и энтузиастов — Dism++. Эта статья станет своего рода кульминацией нашей серии статей о программном обеспечении: В ней мы обсудим, как создать пользовательскую сборку Windows с помощью Dism++. А создание пользовательских сборок Windows является простым и понятным. Нам не нужна виртуальная машина для создания образа основной системы, не нужен установочный или живой диск для загрузки образа, не нужны командные строки. Мы будем использовать 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.

Из пустого пространства инициализированного виртуального жесткого диска

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

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

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

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

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

Затем нам нужно использовать команды, аналогичные тем, которые обсуждались в предыдущей статье, для инициализации регистров и стека, а также команду 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 в секции 2000 по смещению 0, а затем переходит в начало файла для его выполнения. Вот и все — ядро операционной системы загружено, и загрузчик сделал свое дело!

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

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

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

  Что такое бронекофе и как приготовить его дома. Бронекофе что это и для чего

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

nas m-f bi n-o boot.bin boot.asm

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

mkdosf s-C floppy.img 1440 dd conv=notrunc if=boot.bin of=floppy.img

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

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

«, 0 load_fail_msg db 13, 10, «Not found!», 0 user_input times 256 db 0 file_list times 1024 db 0 %include «lib.asm»

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

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

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

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

mov ax, 2000h mov ds, ax mov es, ax loop: mov si, prompt call lib_print_string mov si, user_input call lib_input_string cmp byte si, 0 je loop cmp word si, "ls" je list_files mov ax, si mov cx, 32768 call lib_load_file jc load_fail call 32768 jmp loop load_fail: mov si, load_fail_msg call lib_print_string jmp loop list_files: mov si, file_list call lib_get_file_list call lib_print_string jmp loop prompt db 13, 10, "MyOS>пользовательский_вход раз 256 дб 0

Это объявление позволяет нам создать 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 КБ — для загружаемой памяти.

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

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

  Яндекс Алиса. Как создать сценарий для алисы?

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

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

nas m-f bi n-o mykernel.bin mykernel.asm

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

Первая операционная система была разработана компанией General Motors для компьютера IBM в 1956 году. Другие владельцы этих компьютеров последовали их примеру и начали разрабатывать свои собственные операционные системы.

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

В конце 1960-х годов была разработана первая версия Unix. Написанный на языке C и свободно распространяемый в первые годы, Unix привлекал все больше внимания и аудитории. Она легко переносилась на новые системы и начала завоевывать популярность.

Как работают демоны, процесс init и как создаются процессы - изучите основы Unix.

Многие современные операционные системы, включая Apple OS X и все варианты систем Linux, являются далекими потомками Unix.

Кратко об истории операционных систем

Microsoft Windows, с другой стороны, была разработана для ряда персональных компьютеров IBM.

Первая операционная система Microsoft называлась не Windows, а MS-DOS. Она была разработана в 1981 году, когда система 86-DOS была куплена у компании Seattle Computer Products и адаптирована к требованиям IBM.

25 интересных фактов о старых компьютерах

Привычное название Windows появилось в 1985 году, когда в MS-DOS был включен графический интерфейс пользователя.

Apple OS X, Microsoft Windows и некоторые системы Linux (включая Android) сегодня контролируют большую часть рынка операционных систем.

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

Как работают демоны, процесс Init и как у процессов рождаются потомки — изучаем основы Unix

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • базовое понимание компьютерной науки (информатики);
  • теория и опыт в программировании;
  • знание высоко- и низкоуровневых языков программирования.

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

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

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

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

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

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

  Как открыть курьерскую службу. Как открыть курьерскую службу доставки по городу с нуля бизнес план?

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

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

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

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

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

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

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

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

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

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

  • базовое понимание компьютерной науки (информатики);
  • теория и опыт в программировании;
  • знание высоко- и низкоуровневых языков программирования.

Что нужно знать для создания своей операционной системы

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

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

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

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

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

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

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

Когда установка будет завершена, не спешите и, как только появится экран приветствия, нажмите CTRL + SHIFT + F3.

Это перезапустит систему в режиме управления. Однако если вы уже создали пользователя и вошли в систему, выполните команду от имени администратора:

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

C:{Windows\System32\sysprep /audit /reboot.

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

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

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

Важно. 17 мая 2016 года компания Microsoft выпустила пакет накопительных обновлений для Windows 7 SP1 KB3125574, который содержит обновления с SP1 по апрель 2016 года. Чтобы уменьшить объем загружаемых обновлений, мы рекомендуем загрузить и установить этот пакет вручную. Для этого необходимо установить обновление KB3020369.

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

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

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

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

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

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

  • «Assembly Language Step-by-Step: Programming with Linux» Джефа Дантеманна;
  • «Modern X86 Assembly Language Programming» Дэниэля Кассварма.

Язык Cи

WAIK должен быть простым в установке и устанавливается с настройками по умолчанию.

Теперь подготовьте образ Windows PE, чтобы создать образ эталонной сборки. Разрядность WinPE должна соответствовать разрядности вашей эталонной сборки.

Откройте меню Пуск — Все программы — Microsoft Windows AIK — Командная строка — Средства разработки и выполните команду для 32-битных систем

copype.cmd x86 e:\win_pe

  • «The C Programming Language» Кернигхана и Ритчи;
  • «C Programming Absolute Beginner’s Guide» Пэрри и Миллера.

Создание эталонной системы

или для 64-разрядных систем

copype.cmd amd64 e:\win_pe

windows-7-waik-001.jpg

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

Теперь перейдите в папку назначения и скопируйте файл winpe.wim в папку ISO\sources и переименуйте его в boot.wim. Затем скопируйте imagex.exe в папку C:{Programmes\Windows AIK\Tools\amd64 или C:{Programmes\Windows AIK\Tools\x86, в зависимости от разрядности.

Затем введите следующую команду в командной строке инструмента разработки:

windows-7-waik-002.jpg

oscdim g-n -be:\win_pe\etfsboot.com e:\win_pe\ISO e:\win_pe\winpe.iso

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

windows-7-waik-003.jpg

Если жесткий диск эталонной системы не был дополнительно разделен на разделы, записанный раздел будет иметь букву D:, а загрузочный диск — E: Проверьте это с помощью команды dir в качестве меры предосторожности.

windows-7-waik-004.jpg

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

e:\imagex /capture d: d:\install.wim «Win7_ULT_x64» /compress maximum /boot /verify.

По желанию укажите диск D: и сохраните его как D:{install.wim, используйте собственное имя образа в кавычках, установите максимальное сжатие и опцию загрузки и проверьте созданный образ. После этого мы можем пойти выпить кофе, этот процесс в среднем занимает около получаса.

Создание собственного дистрибутива

Была ли эта статья полезной? Поддержите автора, и новые статьи будут появляться чаще:

Или подпишитесь на наш канал в Telegram:

windows-7-waik-006.jpg

windows-7-waik-007.jpg

windows-7-waik-008.jpg

windows-7-waik-009.jpg

windows-7-waik-010.jpg

windows-7-waik-011.jpg

Дополнительные материалы:

Поддержи проект!

Подпишись на наш Telegram-канал

Оцените статью
Бизнес блог