Загрузчик в C++

Я бездельничал несколько раз путем создания маленького загрузчика блока на гибком диске, и задавался вопросом, возможно ли сделать загрузчик в C++ и раз так где я мог бы начать? Кто знает я не уверен, что это даже использовало бы int main().

Спасибо за любую справку.

7
задан nosedive25 17 July 2010 в 21:53
поделиться

4 ответа

Если вы пишете загрузчик, вы, по сути, начинаете с нуля: небольшой фрагмент кода загружается в память и выполняется. Вы можете написать большую часть вашего загрузчика на C++, но сначала вам нужно будет создать собственную среду выполнения C++.

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

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

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

Создание подходящей среды для C++ требует больше усилий, поскольку здесь требуется больше инициализации, а также есть основные возможности языка, которые требуют поддержки во время выполнения (опять же, это до рассмотрения возможностей библиотеки). К ним относятся:

  • запуск статических конструкторов;
  • распределение памяти для поддержки new и delete;
  • поддержка информации о типах во время выполнения (RTTI);
  • поддержка исключений;
  • возможно, некоторые другие вещи, которые я забыл упомянуть.

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

(Те же принципы применимы во встроенных системах, и нередко такие системы используют C++, но только ограниченно - например, без исключений и/или RTTI, поскольку поддержка времени выполнения не реализована.)

.
9
ответ дан 6 December 2019 в 12:46
поделиться

Загрузчики не имеют "int main ()", если вы не написали ассемблерный код для его вызова. Если вы пишете загрузчик этапа 1, то это серьезно не рекомендуется.

В остальном, на osdev.org есть отличная документация по этой теме.
Хотя , вероятно, возможно создать загрузчик на C ++, помните, что не следует связывать свой код с какими-либо динамическими библиотеками, и помните, что то, что это C ++, не означает, что вы можете / должны использовать STL и т. д.

2
ответ дан 6 December 2019 в 12:46
поделиться

Прошло много времени с тех пор, как я играл с написанием загрузчиков, так что я работаю по памяти.

Для x86-загрузчика вам нужно иметь компилятор C++, который может выдавать x86-ассемблер, или, по крайней мере, вам нужно написать свою собственную преамбулу на 16-битном ассемблере, которая переведет CPU в 32-битный защищенный (или 64-битный длинный) режим, прежде чем вы сможете вызвать свои функции C++.

Однако, как только вы это сделаете, вы сможете использовать большинство, если не все, возможности языка Си++, если только не будете держаться подальше от вещей, которые требуют наличия базовой libc. Но статически связывайте все без CRT, и вы будете в полном порядке.

3
ответ дан 6 December 2019 в 12:46
поделиться

Да, возможно. У вас есть элементы ответа и полезные ссылки в этом вопросе

Вы также можете посмотреть здесь, там есть пример загрузчика C++.

Главное, что нужно понять, это то, что вам нужно создать плоский двоичный файл вместо обычных причудливых форматов исполняемых файлов (PE в Windows или ELF в Unix), потому что этим форматам файлов нужна ОС для их загрузки, и в загрузчик у вас еще нет ОС.

Использование библиотеки не является проблемой, если вы связываетесь статически (динамическая ссылка невозможна из-за вышеупомянутой проблемы с исполняемым файлом). Но очевидно, что все точки входа, связанные с OS API, недоступны...

2
ответ дан 6 December 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: