Я пытаюсь ознакомиться с процедурами подключения и запуска в микроконтроллерах ARM Cortex-M4. При просмотре скриптов компоновщика почти все разделы отмечены как загружаемые.
Сначала я подумал, что это означает, что он будет скопирован с флэш-памяти в ОЗУ, но потом я узнал, что это делается по-другому. Итак, что значит загружаемый раздел во флеш-памяти? Разве он уже не загружен и не запускается с места во флеш-памяти? Также я имею в виду раздел, содержащий инструкции.
Означает ли загружаемый в этом контексте загрузку отладчиком в устройство?
незагружаемые разделы — это те, которые, например, содержат символы для отладки — person Community schedule 07.10.2017
все, что используется самой программой, является загружаемым, .text, .rodata, .data, .bss и т. д. — person Community schedule 07.10.2017
какой формат файла, я так понимаю, вы имеете в виду эльфийку? (что не относится к микроконтроллерам, кстати, также используется с операционными системами) — person Community schedule 07.10.2017
Да, эльф. Я не понимаю, когда вы отмечаете раздел как загружаемый, что это значит? Откуда он загружается и куда загружается? — person Community schedule 07.10.2017
для микроконтроллера, который зависит от программного обеспечения, которое вы используете, чтобы идеально загрузить программу во флэш-память. Некоторому программному обеспечению нравятся только необработанные двоичные изображения (arm-any-objcopy myprog.elf -O binary myprog.bin), некоторые могут читать elf, ihex, srec, coff или другие форматы файлов и извлекать соответствующие элементы из этих форматов и загружать их байтов во флеш-память. — person Community schedule 07.10.2017
полнофункциональная программа cortex-m
flash.s
so.c
flash.ld ПАМЯТЬ {rom: ORIGIN = 0x00000000, LENGTH = 0x1000 ram: ORIGIN = 0x20000000, LENGTH = 0x1000}
строить
(можно использовать cortex-m4 либо работает)
so.list
будучи менее сложным скриптом компоновщика, и программа эльфа имеет меньше вещей
часть readelf
hexdump -C so.bin
«двоичный» бывает разных видов, к сожалению, это плохо названный термин, так как он очень сбивает с толку. Все, что вы видите в приведенном выше дизассемблировании, требуется для запуска программы, это настоящая двоичная часть этого, она должна быть загружена туда, где вам нужно, чтобы она была загружена для запуска. если в операционной системе, то операционная система читает файл elf, извлекает загружаемые разделы с их адресами / смещениями и загружает их в память перед запуском в точке входа. Воспользуйтесь преимуществами инструментов, уже имеющих формат файла elf, и мы можем повторно использовать некоторые из них для микроконтроллеров, мы не можем / обычно не можем использовать точку входа, поскольку это не имеет смысла, мы должны сделать так, чтобы точка входа / вектора соответствовала тому, что оборудование нуждается, в данном случае, в векторной таблице.
Шестнадцатеричный дамп, поступающий из objcopy, также показывает части, которые мы должны видеть процессору для запуска программы или загружать их в адресное пространство / память (в данном случае флэш-память находится в памяти или адресном пространстве).
Но «двоичный» файл elf также содержит символы отладки на тот случай, если вы хотите запустить отладчик, добавить еще несколько параметров в командную строку цепочки инструментов, и вы получите еще больше информации о том, где эти элементы находятся в файле исходного кода, чтобы вы в некоторых случаях мог видеть язык высокого уровня при пошаговом прохождении кода. Это не загружаемые разделы, они описывают программу или служат только для помощи, они не являются машинным кодом или данными, которые нужны процессору для выполнения программы, поэтому их не нужно загружать в область памяти.
еще один «двоичный» формат файла
у него есть небольшая дополнительная информация, но почти все это часть, которую мы должны загрузить в адресное пространство для запуска программы
другой формат двоичного файла
также большая часть этого программного обеспечения.
elf — это просто еще один формат файла (довольно популярный среди инструментов GNU, но все еще просто другой формат файла), он содержит машинный код и необходимые данные, а также множество других вещей, машинный код и данные — это то, что мы должны загрузить в RAM, если это операционная система, или то, что мы в идеале загружаем во флеш-память для микроконтроллера, но не все микроконтроллеры одинаковы, некоторые из них основаны только на оперативной памяти, и программа загружается через usb во время перечисления (в оперативную память). и другие решения, или при отладке у вас, вероятно, могут быть элементы, загруженные в оперативную память, в зависимости от mcu и инструментов, хотя это не то, как загружается вещь, поэтому это не будет действительно хорошим двоичным файлом.
если вы чувствуете необходимость обнулить .bss и иметь какие-либо .data, тогда вам нужна дополнительная информация, смещение и размер .bss, а также смещение и содержимое .data, затем начальная загрузка обнуляет и копирует эти элементы, и вам это нужно информация в энергонезависимой флэш-памяти / ПЗУ, это просто дополнительные данные, которые требуются от машинного кода и данных, необходимых для запуска программы. Если вы позволяете другим писать код за вас, то, возможно, существуют адаптированные сценарии компоновщика и код начальной загрузки, который позволяет вам просто иметь элементы .data и нажимать кнопку сборки на графическом интерфейсе, и все это волшебным образом оказывается на месте, когда ваша точка входа (основная () по соглашению и / или стандартно) запускает выполнение кода, представляющего ваш высокоуровневый код, в точке входа C.
Если вы используете инструменты GNU, у вас есть все необходимое для изучения происходящего, вы можете разобрать объекты и посмотреть, как они влияют на окончательную программу. формат файла elf довольно прост для синтаксического анализа, вы можете написать свою собственную программу для анализа, если хотите, 30-минутный проект. можно увидеть старые и все еще используемые форматы записи Intel hex или Motorola, просто посмотрите их в Википедии, чтобы узнать, что там происходит, очевидно, что преимущество перед файлом необработанного образа памяти заключается в том, что у вас есть разные разделы данных, которые не являются линейными Вам не нужно использовать подушечку, вы можете перейти к — person Community; 07.10.2017
в пространстве, так как в каждой строке данных есть начальный адрес. — person Community; 07.10.2017
вы можете видеть в дампе readelf, что фактическая программа помечена AX, и это то, что должно быть в устройстве, я мог бы добавить .bss или другой и сделать программу больше, и это может создать новые разделы, которые также должны быть ( загружен) в устройство. — person Community; 07.10.2017
также таблица символов показана в дампе readelf, имена меток и тому подобное, если вы хотите, скажем, … дизассемблировать программу (objdump -D) и получить несколько меток вместо необработанных адресов … (явно не должен быть в устройстве для работы, не загружается). — person Community; 07.10.2017
Как побочный вопрос: почему ячейки памяти за стеком (по-видимому, несут адреса для меток
start
иhang
) смещены на 1? ELF говорит, что эти метки на 10 и 16 соответственно, не так ли? — person Community; 10.10.2017он привязан к инструкции bx / blx и расширен за ее пределы. Инструкции Arm 32-битные, 32-битные выровненные, инструкции большого пальца — одно или два 16-битных полуслова, выровненные полуслова. поэтому lsbit всегда равен нулю. они использовали lsbit для обозначения режима большого пальца при использовании таких инструкций, как bx. Lsbit потребляется и помещается в cpsr (бит большого пальца), а также используется, чтобы оставаться в или переключать режимы. Тогда по какой-то причине эта таблица векторов работает точно так же, даже если это явно только большой палец cortex-m. Так что исторически это имеет смысл, но почему именно это вопрос к ARM. — person Community; 10.10.2017
в качестве метки функции они или помечены единицей, поскольку фактический адрес, по которому инструкции извлекаются из lsbit, равен нулю. — person Community; 10.10.2017