Подтвердить что ты не робот

Загрузочный загрузчик в C/С++?

Можно ли создать загрузчик на C или С++ без использования какого-либо типа Assembler (и желательно без использования __asm)? Я пишу операционную систему и хочу, чтобы она была полностью написана на C и С++.

4b9b3361

Ответ 1

Это довольно системная зависимость. В большинстве случаев ответ будет отрицательным - вам нужно будет написать какую-то пользовательскую сборку, чтобы настроить время выполнения C, прежде чем запускать свой код на C. Однако есть некоторые исключения. Например, ARM Cortex-M0 может запускать код C из reset.

Предположительно, однако, вы не используете M0, поэтому вам нужно будет написать сборку. Опять же, это зависит от системы/чипа, но вы можете уйти с чем-то простым:

reset_vector:
    mov  sp, SOME_KNOWN_GOOD_STACK_ADDRESS
    call c_entry_point

который просто инициализирует указатель стека и вызывает вашу точку входа в программу C. Разумеется, эта простая настройка зависит от вашего чипа, имеющего векторную/векторную таблицу reset, которая его поддерживает, RAM (или что-то вроде RAM) инициализируется до того, как будет вызван вектор reset и т.д. В ранней инициализации системы, как правило, много "ошибок".

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

Удачи!

Ответ 2

Предполагая, что это для x86, вы, вероятно, можете получить что-то в 16-битном режиме, если у вас есть правильные параметры компилятора, и вам удастся правильно настроить макет вашего bootsector с помощью магии правильного компоновщика.

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

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

Отличный ресурс для того, что вы пытаетесь сделать: OSDev.

Ответ 3

Предполагая защищенный режим x86:

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

    lgdt[GDTR]
    jmp CODESEL:FLUSH
FLUSH:
    ...

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

Ответ 4

Нет, это невозможно с "чистым" C, по крайней мере на x86... В дополнение к тому, что машина x86 загрузится в 16-разрядный реальный режим (требуется, чтобы компилятор генерировал 16-битный и не 32-битный код), вам понадобится возможность маскировать прерывания, настраивать регистры сегментов, загружать код в память с аппаратного устройства (то есть на диск), настраивать стек, доступ к портам ввода-вывода и т.д., Все из которых x86 и другие платформы требуют доступа к регистрам CPU и/или определенным командам сборки.

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