Как запустить программу без windows

Обновлено: 08.07.2024

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

Как вы запускаете программу самостоятельно без операционной системы?

вы помещаете свой двоичный код в место, где процессор ищет после перезагрузки (например, адрес 0 на ARM).

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

общий ответ на вопрос: это может быть сделанный. Это часто предлагается как "программирование голого металла". Чтобы читать с флеш-накопителя, вы хотите знать, что такое USB, и вы хотите иметь драйвер для работы с этим USB. Программа на этом диске также должна быть в определенном формате. В какой-то конкретной файловой системе. Это то, что обычно делают загрузчики. Многие доски ARM позволяют вам делать некоторые из этих вещей. У некоторых есть загрузчик, который поможет вам с базовой настройкой.

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

кроме того, если вы не хотите экспериментировать непосредственно на оборудовании, вы можете запустить его как виртуальную машину с помощью гипервизоров, таких как qemu. См. как запустить "hello world" непосредственно на виртуализированном оборудовании ARM здесь.

Runnable примеры

технически, программа, которая работает без ОС, является ОС. Итак, давайте посмотрим, как создать и запустить некоторые крошечные hello world OSes.

код всех приведенных ниже примерах присутствует это GitHub РЕПО. Все было протестировано на Ubuntu 14.04 AMD64 QEMU и реальном оборудовании ThinkPad T430.

загрузочный сектор

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

здесь мы создаем один printf звоните:

main.img содержит следующее:

4 в восьмеричной == 0xf4 в hex: кодировка для hlt инструкция, которая говорит CPU прекратить работу.

поэтому наша программа ничего не будет делать: только начать и остановка.

мы используем восьмеричный потому что \x шестнадцатеричные номера не указаны POSIX.

мы могли бы легко получить эту кодировку с:

но 0xf4 кодировка также документирована в руководстве Intel, конечно.

%509s произвести 509 мест. Необходимо заполнить файл до байта 510.

52 в восьмеричной == 0x55 следовал по 0xaa : волшебные байты требует аппаратура. Они должны быть байтами 511 и 512.

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

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

работы на реальном оборудовании

эмуляторы-это весело, но аппаратное обеспечение-это реальная сделка.

сжечь изображение на USB-накопитель (уничтожит ваши данные!):

подключите USB к компьютеру

скажите ему загрузиться с USB.

это означает, что прошивка выбирает USB перед жестким диском.

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

очень часто можно настроить порядок поиска в этих меню.

Привет, мир

теперь, когда мы сделали минимальную программу, давайте перейдем к hello world.

очевидный вопрос: как сделать IO? Несколько вариантов:

  • попросите прошивку, например BIOS или UEFI, сделать, если для нас
  • VGA: специальная область памяти, которая печатается на экран при записи. Может использоваться в защищенном режиме.
  • напишите драйвер и поговорите непосредственно с оборудованием дисплея. Это "правильный" способ сделать это: более мощный, но более сложные.
  • используйте функции отладки чипов. ARM называет их semihosting например. На реальном оборудовании это требует дополнительной аппаратной и программной поддержки, но на эмуляторах это может быть бесплатный удобный вариант. пример.

здесь мы сделайте пример BIOS, как это проще. Но заметьте, что это не самый надежный метод.

вот газовый код:

кроме стандартных инструкций по сборке userland, у нас есть:

.code16 : говорит газу вывести наружу 16-разрядный код

cli : отключить прерывания программного обеспечения. Они могут заставить процессор начать работать снова после hlt

int x10 : делает a Вызов BIOS. Это то, что печатает символы один за другим.

быстрый и грязный способ скомпилировать это с:

и работать main.img как и раньше.

здесь есть два важных флага:

--oformat binary : выведите исходный двоичный код сборки, не деформируйте его внутри файла ELF, как в случае обычного userland выполнимые программы.

-Ttext 0x7C00 : мы должны сказать компоновщику ld где будет размещен код, чтобы он мог получить доступ к памяти.

в частности, это используется на этапе перемещения. Подробнее об этом здесь.

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

прошивка

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

то, что на самом деле работает первым, является так называемым прошивка, который является программным обеспечением:

  • сделано производителями оборудования
  • обычно закрытый источник, но, вероятно, c-based
  • хранится в памяти только для чтения, и поэтому сложнее / невозможно изменить без согласие продавца.

хорошо известные прошивки включают в себя:

  • BIOS: старая прошивка x86. SeaBIOS-это реализация с открытым исходным кодом по умолчанию, используемая QEMU.
  • UEFI: преемник BIOS, лучше стандартизированный, но более способный и невероятно раздутый.
  • Coreboot: благородный крест арка с открытым исходным кодом попытка

прошивка делает вещи например:

петля над каждым жестким диском, УСБ, сетью, ЕТК. пока не найдешь что-нибудь загрузочное.

когда мы запускаем QEMU, -hda говорит, что main.img - это жесткий диск, подключенный к оборудованию, и

hda является первым, который будет опробован, и он используется.

загрузите первые 512 байт в адрес оперативной памяти 0x7c00 , поместите туда RIP процессора, и пусть он работает

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

можно утверждать, что прошивки неотличимы от ос, и что прошивка является единственным "истинным" голым металлическим программированием, которое можно сделать.

сложно

при включении ПК чипы, составляющие чипсет (northbridge, southbridge и SuperIO), еще не инициализированы должным образом. Несмотря на то, что BIOS ROM настолько удален от ЦП, насколько это возможно, это доступно ЦП, потому что это должно быть, иначе у ЦП не было бы инструкций для выполнения. Это не означает, что BIOS ROM полностью сопоставлен, как правило, нет. Но достаточно сопоставлено, чтобы получить процесс загрузки продолжается. Любые другие устройства, просто забудьте об этом.

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

начальное состояние Post BIOS

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

регистры как %ds и %es имеют важные побочные эффекты, поэтому вы должны обнулить их, даже если вы не используете их явно.

обратите внимание, что некоторые эмуляторы лучше, чем реальные оборудование и дать вам хорошее начальное состояние. Затем, когда вы идете работать на реальном оборудовании, все ломается.

GRUB Multiboot

загрузочные сектора просты, но они не очень удобны:

  • вы можете иметь только одну ОС на диск
  • код загрузки должен быть очень маленьким и вписываться в 512 байт. Это можно решить с помощью int 0x13 BIOS вызов.
  • вам нужно сделать много запуска себя, как переход в защищенный режим

именно по этим причинам GRUB создал более удобный формат файла под названием multiboot.

если вы подготовите свою ОС как многозадачный файл, GRUB сможет найти его внутри обычной файловой системы.

это что делают большинство дистрибутивов, помещая изображения ОС под /boot .

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

Эль Torito С

также возможно произвести гибридное изображение которое работает на или ИСО или УСБ. Это можно сделать с помощью grub-mkrescue (пример), а также выполняется ядром Linux на make isoimage используя isohybrid .

руку

ARM-land имеет свои собственные соглашения (или больше отсутствия соглашений, так как ARM лицензирует IP поставщикам, которые его изменяют), но общие идеи те же:



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

Итак, цель: затратив как можно меньше усилий, создать собственную загрузочную флешку, которая всего-навсего печатает на экране компьютера классический “Hello World”.

Если быть более точным, то нам нужно “попасть” в защищенный режим с отключенной страничной адресацией и прерываниями – самый простой режим работы процессора с привычным поведением для простой консольной программы. Самый разумный способ достичь такой цели – собрать ядро поддерживающее формат multiboot и загрузить его с помощью популярного загрузчика Grub. Альтернативой такого решения является написание собственного volume boot record (VBR), который бы загружал написанный собственный загрузчик (loader). Приличный загрузчик, как минимум, должен уметь работать с диском, с файловой системой, и разбирать elf образы. Это означает необходимость написания множества ассемблерного кода, и немало кода на С. Одним словом, проще использовать Grub, который уже умеет делать все необходимое.

Начнем с того, что для дальнейших действий необходим определенный набор компиляторов и утилит. Проще всего воспользоваться каким-нибудь Linux (например, Ubuntu), поскольку он уже будет содержать все что нужно для создания загрузочной флэшки. Если вы привыкли работать в Windows, то можно настроить виртуальную машину с Linux (при помощи Virtual Box или VMware Workstation).

Если вы используете Linux Ubuntu, то прежде всего необходимо установить несколько утилит:
1. Grub. Для этого воспользуемся командой:


2. Qemu. Он нужен, чтобы все быстро протестировать и отладить, для этого аналогично команда:


Теперь наш план выглядит так:
1. создать программу на C, печатающую строку на экране.
2. собрать из нее образ (kernel.bin) в формате miniboot, чтобы он был доступен для загрузки с помощью GRUB.
3. создать файл образа загрузочного диска и отформатировать его.
4. установить на этот образ Grub.
5. скопировать на диск созданную программу (kernel.bin).
6. записать образ на физический носитель или запустить его в qemu.


а процесс загрузки системы:

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

Скрипт компановщика для ядра.

Код на ассемблере, который вызывается Grub’ом и передает управление функции main из программы на С.

Папка с заголовочными файлами.

Папка с файлами Grub’а.

Папка с функциями общего назначения. В том числе реализация printf.

Шаг 1. Создание кода целевой программы (ядра):

Сигнатура формата Multiboot

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

0xE4524FFE= -(MAGIC + FLAGS)

Если все указанные условия выполнены, то Grub через регистры %eax и %ebx передает указатель на структуру multiboot Information и значение 0x1BADB002 соответственно. Структура multiboot Information содержит различную информацию, в том числе список загруженных модулей и их расположение, что может понадобиться для дальнейшей загрузки системы.
Для того, чтобы файл с программой содержал необходимые сигнатуры создадим файл loader.s, со следующим содержимым:

Весь последующий код попадет в исполняемую секцию .text.

Объявляем символ loader видимым для линковщика. Это требуется, так как линковщик будет использовать loader как точку входа.

Этот код формирует сигнатуру формата Multiboot. Директива .set устанавливает значение символа в выражение справа от запятой. Директива .align 4 выравнивает последующее содержимое по 4 байта. Директива .long сохраняет значение в четырех последующих байтах.

И теперь последняя часть:


Первой инструкцией происходит сохранение значения верхушки стека в регистре %esp. Так как стек растет вниз, то в %esp записывается адрес конца диапазона отведенного под стек. Две последующие инструкции сохраняют в ранее зарезервированных диапазонах по 4 байта значения, которые Grub передает в регистрах %eax, %ebx. Затем происходит вызов функции main, которая уже написана на Си. В случае возврата из этой процедуры процессор зациклится.

Шаг 2. Подготовка дополнительного кода для программы (системная библиотека):

Поскольку вся программа пишется с нуля, то функцию printf нужно написать с нуля. Для этого нужно подготовить несколько файлов.
Создадим папку common и include:


Потом, удалить функцию printf_init_global и все ее упоминания в этом файле:

Затем удалить переменную printf_lock и все ее упоминания в этом файле:


Функция printf использует функцию putchar, которую так же нужно написать. Для этого создадим файл common\screen.с, со следующим содержимым:


Указанный код, содержит простую логику печати символов на экран в текстовом режиме. В этом режиме для записи символа используется два байта (один с кодом символа, другой с его атрибутами), записываемые прямо в видео память отображаемую сразу на экране и начинающуюся с адреса 0xB8000. Разрешение экрана при этом 80x25 символов. Непосредственно печать символа осуществляется при помощи макроса PUT.
Теперь не хватает всего несколько заголовочных файлов:
1. Файл include\screen.h. Объявляет функцию putchar, которая используется в функции printf. Содержимое файла:


2. Файл include\printf.h. Объявляет функцию printf, которая используется в main. Содержимое файла:

Таким образом папки include и common содержат минимальный код системной библиотеки, которая необходима любой программе.

Шаг 3. Создание скрипта для компоновщика:

Создаем файл linker.ld, который будет использоваться компоновщиком для формирования файла целевой программы (kernel.bin). Файл должен содержать следующее:


Встроенная функция ENTRY() позволяет задать входную точку для нашего ядра. Именно по этому адресу передаст управление grub после загрузки ядра. Компоновщик при помощи этого скрипта создаст бинарный файл в формате ELF. ELF-файл состоит из набора сегментов и секций. Список сегментов содержится в Program header table, список секций в Section header table. Линковщик оперирует с секциями, загрузчик образа (в нашем случае это GRUB) с сегментами.

Как видно на рисунке, сегменты состоят из секций. Одним из полей, описывающих секцию, является виртуальный адрес, по которому секция должна находиться на момент выполнения. На самом деле, у сегмента есть 2 поля, описывающих его расположение: виртуальный адрес сегмента и физический адрес сегмента. Виртуальный адрес сегмента это виртуальный адрес первого байта сегмента в момент выполнения кода, физический адрес сегмента это физический адрес по которому должен быть загружен сегмент. Для прикладных программ эти адреса всегда совпадают. Grub загружает сегменты образа, по их физическому адресу. Так как Grub не настраивает страничную адресацию, то виртуальный адрес сегмента должен совпадать с его физическим адресом, поскольку в нашей программе виртуальная память так же не настраивается.


Говорит о том, что далее описываются секции.

Это выражение указывает линковщику, что все последующие секции находятся после адреса LMA.

Директива выше, означает, что секция выровнена по 0x1000 байт.

Отдельная секция multiboot, которая включает в себя секцию .text из файла loader.o, сделана для того, что бы гарантировать попадание сигнатуры формата multiboot в первые 8кб образа ядра.

Теперь скомпилируем код в бинарный файл следующими командами:

С помощью objdump’а рассмотрим, как выглядит образ ядра после линковки:



Как можно видеть, секции в образе совпадают с теми, что мы описали в скрипте линковщика. Линковщик сформировал 3 сегмента из описанных секций. Первый сегмент включает в себя секции .multiboot, .text, .rodata и имеет виртуальный и физический адрес 0x00100000. Второй сегмент содержит секции .data и .bss и располагается по адресу 0x00104000. Значит все готово для загрузки этого файла при помощи Grub.

Шаг 4. Подготовка загрузчика Grub:
Создать папку grub:


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


Создать файл grub/menu.lst, со следующим содержимым:

Шаг 5. Автоматизация и создание загрузочного образа:

Для автоматизации процесса сборки будем использовать утилиту make. Для этого создадим файл makefile, который будет собирать компилировать исходный код, собирать ядро и создавать загрузочный образ. Makefile должен иметь следующее содержимое:

В файле объявлены две основные цели: all – компилирует ядро, и image – которая создает загрузочный диск. Цель all подобно привычным makefile содержит подцели .s.o и .c.o, которые компилируют *.s и *.c файлы в объектные файлы (*.o), а так же цель для формирования kernel.bin, которая вызывает компоновщик с созданным ранее скриптом. Эти цели выполняют ровно те же команды, которые указаны в шаге 3.
Наибольший интерес здесь представляет создание загрузочного образа hdd.img (цель image). Рассмотрим поэтапно, как это происходит.

Эта команда создает образ, с которым будет происходить дальнейшая работа. Количество секторов выбрано не случайно: 16065 = 255 * 63. По умолчанию fdsik работает с диском так, как будто он имеет CHS геометрию, в которой Headers (H) = 255, Sectors (S) = 63, а Cylinders( С ) зависит от размера диска. Таким образом, минимальный размер диска, с которым может работать утилита fdsik, без изменения геометрии по умолчанию, равен 512 * 255 * 63 * 1 = 8225280 байт, где 512 – размер сектора, а 1 – количество цилиндров.
Далее создается таблица разделов:

Первая команда монтирует файл hdd.img к блочному устройству /dev/loop1, позволяя работать с файлом как с устройством. Вторая команда создает на устройстве /dev/loop1 таблицу разделов, в которой находится 1 первичный загрузочный раздел диска, занимающий весь диск, с меткой файловой системы FAT32.
Затем форматируем созданный раздел. Для этого нужно примонтировать его как блочное устройство и выполнить форматирование.

Первая команда монтирует ранее созданный раздел к устройству /dev/loop2. Опция –offset указывает адрес начала раздела, а –sizelimit адрес конца раздела. Оба параметра получаются с помощью команды fdisk.

Утилита mkdosfs форматирует раздел в файловую систему FAT32.
Для непосредственной сборки ядра используются рассмотренные ранее команды в классическом синтаксисе makefile.
Теперь рассмотрим как установить GRUB на раздел:

После выполнения вышеприведенных команд, образ будет готов к установке GRUB’а. Следующая команда устанавливает GRUB в MBR образа диска hdd.img.


Все готово к тестированию!

Шаг 6. Запуск:

Для компиляции, воспользуемся командой:

После которой должен появиться файл kernel.bin.
Для создания загрузочного образа диска, воспользуемся командой:

В результате чего должен появиться файл hdd.img.
Теперь с образа диска hdd.img можно загрузиться. Проверить это можно с помощью следующей команды:




Для проверки на реальной машине нужно сделать dd этого образа на флэшку и загрузиться с нее. Например такой командой:


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

Ссылки на следующие статьи цикла:
"Как запустить программу без операционной системы: часть 2"
"Как запустить программу без операционной системы: часть 3: Графика"
"Как запустить программу без операционной системы: часть 4. Параллельные вычисления"
"Как запустить программу без операционной системы: часть 5. Обращение к BIOS из ОС"
"Как запустить программу без операционной системы: часть 6. Поддержка работы с дисками с файловой системой FAT"

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


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

Запускаем компьютер без операционной системы с CD

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

Вы можете запустить компьютер с помощью установочного компакт-диска или загрузочного USB-накопителя. Как сделать загрузочную флешку, мы рассказывали в отдельных статьях: инструкция для Windows 7 и Windows 10.

  • Подключите USB-накопитель либо вставьте установочный диск в дисковод и перезагрузите компьютер.
  • Возможно, вам сначала придется изменить порядок загрузки в BIOS. Для этого нажмите клавишу F2 в стартовом окне. Другая клавиша, например F8 или F10, может вывести к Bios. На некоторых компьютерах для этого часто необходимо нажать кнопку DEL.
  • Соответствующий параметр для порядка загрузки можно найти в BIOS на вкладке «Загрузка» (Boot).
  • Когда вы сохраните изменения в BIOS и выйдите из него, компьютер перезагрузится.

Устанавливаем операционную систему

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

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

Как запустить программу без работающей операционной системы? Можете ли вы создавать программы сборки, которые компьютер может загружать и запускать при запуске, например загружаете компьютер с флешки и на нем запускается программа, которая стоит на процессоре?

3 ответа

Как запустить программу без работающей операционной системы?

Вы помещаете свой двоичный код в место, где процессор ищет после перезагрузки (например, адрес 0 на ARM).

Можете ли вы создавать программы сборки, которые компьютер может загружать и запускать при запуске (например, загружать компьютер с флэш-накопителя, и он запускает программу, которая находится на диске)?

Общий ответ на вопрос: это можно сделать. Это часто называют «программированием на голое железо». Чтобы читать с флэш-накопителя, вы хотите знать, что такое USB, и вам нужен драйвер для работы с этим USB. Программа на этом диске также должна быть в каком-то определенном формате, в какой-то конкретной файловой системе . Это то, что обычно делают загрузчики, но ваша программа может включать собственный загрузчик, чтобы она была автономной, если прошивка будет только загрузить небольшой блок кода.

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

Здесь вы можете найти отличное руководство о том, как сделать базовая операционная система на Raspberry Pi.

Кроме того, если вы не хотите экспериментировать непосредственно на оборудовании, вы можете запустить его как виртуальную машину, используя гипервизоры, такие как qemu. Узнайте, как запустить "hello world" непосредственно на виртуализированном оборудовании ARM здесь.

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

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

Например, эту страницу можно использовать как отправную точку:

Здесь вся операционная система полностью помещается в 512-байтовый загрузочный сектор ( MBR )!

Такую или подобную простую ОС можно использовать для создания простой платформы, которая позволит нам:

заставить загрузчик загружать последующие сектора на диске в ОЗУ и перейти к этой точке, чтобы продолжить выполнение . Или вы можете прочитать FAT12, файловую систему, используемую на гибких дисках, и реализовать ее .

Однако есть много возможностей. Например, чтобы увидеть большую ОС на ассемблере x86 , мы можем изучить MykeOS, операционная система x86, которая представляет собой обучающий инструмент , показывающий, как простые 16-разрядные операционные системы в реальном режиме работают с хорошо закомментированный код и обширная документация .

Загрузчик как вдохновение

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

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

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

В частности, показано, как использовать технику «смешанного кода» , благодаря которой можно комбинировать высокоуровневые конструкции (из C или C ++ ) с низкоуровневыми командами (из Ассемблера ). Это очень полезный метод, но мы должны помнить, что:

для сборки программы и получения исполняемого файла вам понадобится компилятор и компоновщик Ассемблера для 16-битного режима . Для C / C ++ вам понадобится только компилятор, который может создавать объектные файлы для 16-битного режима .

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

Приложения UEFI как вдохновение

В приведенных выше примерах использован факт загрузки сектора MBR на носитель данных. Однако мы можем углубиться в глубины , например, используя Приложения UEFI :

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

Типом приложения UEFI является загрузчик ОС , такой как GRUB, rEFInd, Gummiboot и Windows Boot Manager; который загружает файл ОС в память и выполняет его. Кроме того, загрузчик ОС может предоставить пользовательский интерфейс, позволяющий выбрать другое приложение UEFI для запуска. Утилиты, такие как оболочка UEFI, также являются приложениями UEFI.

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

Изучение проблем безопасности как вдохновение

Хорошо известно, что существует целая группа вредоносных программ (которые являются программами) , которые запускаются до запуска операционной системы .

Огромная группа из них работает в секторе MBR или приложениях UEFI, как и все вышеперечисленные решения, но есть и те, которые используют другую точку входа, такую ​​как Загрузочная запись тома (VBR) или BIOS :

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

Или, возможно, еще один.

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

Различные способы загрузки

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

Эта программа представляет собой несколько строк, которые должны быть скомпилированы на компиляторе с настроенной компиляцией Windows - например, компилятором Visual Studio - любой доступной версии.

Читайте также: