Я бездельничал несколько раз путем создания маленького загрузчика блока на гибком диске, и задавался вопросом, возможно ли сделать загрузчик в C++ и раз так где я мог бы начать? Кто знает я не уверен, что это даже использовало бы int main()
.
Спасибо за любую справку.
Если вы пишете загрузчик, вы, по сути, начинаете с нуля: небольшой фрагмент кода загружается в память и выполняется. Вы можете написать большую часть вашего загрузчика на C++, но сначала вам нужно будет создать собственную среду выполнения C++.
Ассемблер - действительно единственный вариант для первого этапа, так как вам нужно создать разумную среду для запуска всего более высокоуровневого. Сделать достаточно для выполнения кода на Си довольно просто - вам нужно:
Затем вы можете перейти к коду в соответствующей точке (например, main()
) и ожидать, что основные функции языка будут работать. (Возможно, что любые возможности стандартной библиотеки, которые были реализованы или подключены, могут потребовать дополнительной инициализации на этом этапе.)
Создание подходящей среды для C++ требует больше усилий, поскольку здесь требуется больше инициализации, а также есть основные возможности языка, которые требуют поддержки во время выполнения (опять же, это до рассмотрения возможностей библиотеки). К ним относятся:
new
и delete
;Ни одна из этих функций не требуется до тех пор, пока не будет запущена среда Си, поэтому код, который их обрабатывает, может быть написан на Си, а не на ассемблере (или даже на подмножестве Си++, которое не использует вышеперечисленные возможности).
(Те же принципы применимы во встроенных системах, и нередко такие системы используют C++, но только ограниченно - например, без исключений и/или RTTI, поскольку поддержка времени выполнения не реализована.)
.Загрузчики не имеют "int main ()", если вы не написали ассемблерный код для его вызова. Если вы пишете загрузчик этапа 1, то это серьезно не рекомендуется.
В остальном, на osdev.org есть отличная документация по этой теме.
Хотя , вероятно, возможно создать загрузчик на C ++, помните, что не следует связывать свой код с какими-либо динамическими библиотеками, и помните, что то, что это C ++, не означает, что вы можете / должны использовать STL и т. д.
Прошло много времени с тех пор, как я играл с написанием загрузчиков, так что я работаю по памяти.
Для x86-загрузчика вам нужно иметь компилятор C++, который может выдавать x86-ассемблер, или, по крайней мере, вам нужно написать свою собственную преамбулу на 16-битном ассемблере, которая переведет CPU в 32-битный защищенный (или 64-битный длинный) режим, прежде чем вы сможете вызвать свои функции C++.
Однако, как только вы это сделаете, вы сможете использовать большинство, если не все, возможности языка Си++, если только не будете держаться подальше от вещей, которые требуют наличия базовой libc. Но статически связывайте все без CRT, и вы будете в полном порядке.
Да, возможно. У вас есть элементы ответа и полезные ссылки в этом вопросе
Вы также можете посмотреть здесь, там есть пример загрузчика C++.
Главное, что нужно понять, это то, что вам нужно создать плоский двоичный файл вместо обычных причудливых форматов исполняемых файлов (PE в Windows или ELF в Unix), потому что этим форматам файлов нужна ОС для их загрузки, и в загрузчик у вас еще нет ОС.
Использование библиотеки не является проблемой, если вы связываетесь статически (динамическая ссылка невозможна из-за вышеупомянутой проблемы с исполняемым файлом). Но очевидно, что все точки входа, связанные с OS API, недоступны...