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

Я несколько раз возился, делая небольшой загрузчик сборки на гибком диске и задавался вопросом, Можно ли сделать загрузчик на c++, и если да, то с чего я могу начать? Насколько я знаю, я не уверен, что он даже будет использовать int main().

Спасибо за любую помощь.

4 ответов


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

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

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

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

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

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

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

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


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

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

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


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

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


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

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

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

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