Что делает цепочки из голого металла особенными?

Зачем мне простой набор инструментов, когда я хочу скомпилировать бинарный файл без базовой ОС? Какие ограничения есть у компиляторов, кроме отсутствующих функций / возможностей, потому что нет OS/stdlibrary. Можно ли использовать какой-нибудь clang / gcc в качестве компилятора с чистым металлом? Моя цель - малина 2.

2 ответа

Решение

Замените "голый металл" на отдельно стоящий, а не на "голый металл".

Вам не нужен отдельно стоящий компилятор для работы с голым металлом. Но тогда вам нужно использовать точно правильную комбинацию опций, чтобы обычный (кросс) компилятор работал как автономный компилятор. С gcc / clang это конечно возможно. Даже не сложно, если знаешь, что делаешь.

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

В целом, создание автономного (кросс) компилятора для работы с голым металлом говорит о трех вещах:

  1. Предотвращает ошибки, которые не спят всю ночь, пытаясь понять, что не так.
  2. В вероятном случае, когда вы строите для другой арки, тогда вы разрабатываете ее, и вы получаете кросс-компилятор с минимальными требованиями (например, не нужен целевой libc).
  3. Предоставляет общую настройку для всех, одинаковые стандартизированные заголовки, так что одни и те же проблемы имеют одинаковые решения для всех.

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

Во-вторых, подумайте о простой программе, подобной этой:

int main()
{
}

Вы можете скомпилировать это с помощью своего кросс-компилятора и получить объектный файл для цели. Теперь проблема заключается в том, как выполнить main() в вашей среде с голым металлом. Как минимум вам понадобится немного кода, обычно ассемблера, который запускается при перезагрузке процессора, устанавливает указатель стека и вызывает main(). Без поддержки других библиотек все остальное зависит от вас. Вам нужно будет написать код для ввода / вывода и т. Д., Специфичный для вашего оборудования.

Я работаю над цепочкой инструментов, которая ориентирована на Linux, но также имеет поддержку разработки на голом железе. В настоящее время цепочка инструментов предназначена для целей ARM, Mips, PowerPC и x86 для разработки на C/C++. Цели Linux полностью поддерживаются, а поддержка ARM для голых желез уже не за горами. "Голый металл" в этом контексте варьируется от простого main(), как я описал выше, до поддержки многих функций POSIX, таких как pthread_create(), поддержка мьютекса и т. д. Он также может работать в средах MMU и не-MMU. Возможно, вы захотите взглянуть на код на http://ellcc.org/ чтобы увидеть, как обрабатывается голый металл. Вы также можете загрузить готовые двоичные файлы для Windows и Linux, если хотите попробовать.

Другие вопросы по тегам