2015-02-27 4 views
1

После being bitten by stack alignment problems Я начал задаваться вопросом, должна ли куча быть выровнена с 8-октетными границами.ARM Cortex-M выравнивание кучи

ARM Cortex EABI заявляет, что для всех вызовов внешних функций стек должен быть 8-выровнен. Я не мог найти никакой информации о том, существуют ли какие-либо ограничения на выравнивание кучи. Похоже, что есть некоторые подсказки, указывающие на то, что куча также должна быть выровнена на 8, но наиболее общедоступный код управления памятью выравнивает ее на 4.

Требование выравнивания стека не должно иметь ничего общего с выравниванием кучи (до тех пор, пока соблюдаются границы слов), поскольку выравнивание не сохраняется при копировании между кучей и стеком. Кроме того, я не могу думать о какой-либо причине, по которой компиляторы должны быть ограничены 8-кратными указателями при указании на элементы с 8 октетами.

Может ли кто-нибудь подтвердить, что для кучи достаточно 4-октетного выравнивания?

ответ

1

Для конкретного случая процессоров Cortex-M выравнивание слов достаточно для распределения кучи, поскольку на Cortex-M нет инструкций, которые требуют более строгого выравнивания, чем выравнивание по словам.

Для Cortex-M4 это объявляется в Cortex-M4 Devices Generic User Guide Раздел 3.3.5:

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

То есть, даже для LDRD/StrD (двойное слово) и LDM/STM (множественный доступ с словом) инструкция, которые, как правило, используемый компилятором для 64-разрядных типов данных, потребность в выровненном доступ только слово- выравнивание.

+0

Из этого ответа я не понимаю, почему куча должна быть выровнена с 8 байтами. Поскольку ** словосочетание используется для слова, двойного слова или множественного доступа к словарю **, достаточно выровнять до 4 байтов. Почему они используют выравнивание по 8 байт? Как и я, этот пост не является ответом. – kyb

+0

Оригинальный вопрос и мой ответ относятся к Cortex-M, где 4-байтовое выравнивание достаточно для любого использования, потому что процессорное ядро ​​никогда не требует более строгого выравнивания для любых доступов. Существуют другие архитектуры ядра процессора, где это необходимо с более строгим выравниванием для обеспечения правильного доступа ко всем возможным типам, которые код может использовать в выделенной памяти. Поэтому вы можете столкнуться с реализацией кучи, которые имеют более строгуюровность. – thomasthorsen