Что делает цепочки из голого металла особенными?
Зачем мне простой набор инструментов, когда я хочу скомпилировать бинарный файл без базовой ОС? Какие ограничения есть у компиляторов, кроме отсутствующих функций / возможностей, потому что нет OS/stdlibrary. Можно ли использовать какой-нибудь clang / gcc в качестве компилятора с чистым металлом? Моя цель - малина 2.
2 ответа
Замените "голый металл" на отдельно стоящий, а не на "голый металл".
Вам не нужен отдельно стоящий компилятор для работы с голым металлом. Но тогда вам нужно использовать точно правильную комбинацию опций, чтобы обычный (кросс) компилятор работал как автономный компилятор. С gcc / clang это конечно возможно. Даже не сложно, если знаешь, что делаешь.
С другой стороны, большинство людей не знают, что они делают, когда они начинают работу с голым металлом, а также люди всегда делают ошибки, и затем части ОС, которые компилятор предназначен для того, чтобы проникнуть в твою работу с голым металлом и все испортить. Автономный компилятор не может этого сделать, поскольку в нем нет ОС, на которую он опирается. Так что вместо странного поведения вашего ядра или сбоев вы получаете ошибки компилятора.
В целом, создание автономного (кросс) компилятора для работы с голым металлом говорит о трех вещах:
- Предотвращает ошибки, которые не спят всю ночь, пытаясь понять, что не так.
- В вероятном случае, когда вы строите для другой арки, тогда вы разрабатываете ее, и вы получаете кросс-компилятор с минимальными требованиями (например, не нужен целевой libc).
- Предоставляет общую настройку для всех, одинаковые стандартизированные заголовки, так что одни и те же проблемы имеют одинаковые решения для всех.
Прежде всего, вам нужен компилятор, который может генерировать код для целевого процессора. В случае 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, если хотите попробовать.