Могу ли я использовать LDREX/STREX для реализации спин-блокировки без включения SCU в многоядерном процессоре ARM Cortex-A9 SoC?
Я знаю, что это может быть странное использование. Я просто хочу знать, могу ли я использовать LDREX/STREX с отключенным SCU.
Я использую двухъядерный процессор Cortext-A9 SoC. Два ядра работают в режиме AMP: каждое ядро имеет свою собственную ОС. Хотя контроллер памяти является общим ресурсом, каждое ядро имеет свое собственное пространство памяти. Один не может получить доступ к памяти другого. Поскольку не требуется согласованность кэша, SCU не включен. В то же время у меня также есть область общей памяти, к которой могут получить доступ оба ядра. Область общей памяти не кэшируется, чтобы избежать проблемы когерентности кэша.
Я определяю спин-блокировку в этой области общей памяти. Эта спин-блокировка используется для защиты доступа к общим ресурсам. Прямо сейчас, спин-блокировка реализована просто так:
void spin_lock(uint32_t *lock)
{
while(*lock);
*lock = 1;
}
void spin_unlock(uint32_t *lock)
{
*lock = 0;
}
где, блокировка - это переменная в разделяемой памяти, поэтому оба ядра могут получить доступ к этой блокировке.
Проблема этой реализации заключается в том, что доступ к блокировке не является эксклюзивным. Вот почему я хочу использовать LDREX/STREX для реализации спин-блокировки. Пожалуйста, позвольте мне повторить мой вопрос:
Могу ли я использовать LDREX/STREX без включенного SCU?
Спасибо!
3 ответа
Итак... прямой ответ на ваш вопрос заключается в том, что да, это возможно - до тех пор, пока что-то еще в системе памяти реализует эксклюзивный монитор для области общей памяти. Если это не так, то ваши STREX всегда будут возвращать OK (а не EXOK), что можно наблюдать как сбой в регистре результатов.
Однако, почему бы вам не включить SCU? Очевидно, что то, что вы пытаетесь сделать, требует согласованного представления памяти между двумя операционными системами, по крайней мере, для этого региона. А с кешами данных PIPT вы не увидите псевдонимов строк кэша в зависимости от того, как они отображаются в каждом изображении.
В целом ответ - нет. Здесь есть две проблемы:
1) Вы не можете использовать эксклюзивную загрузку / хранение в не кэшированной памяти. Эксклюзивные операции действуют только на "нормальную" идемпотентную память.
2) В руководстве ARM не указано, как работают монопольные мониторы в сочетании с согласованностью памяти, но любая разумная реализация, по сути, собирается поместить монитор в механизм получения строк кэша. Если вы отключили отслеживание строк кэша, вы, скорее всего, сделали мониторы неработающими на вашем чипе.
Ваш единственный (плохо сформированный) вопрос,
Могу ли я использовать LDREX/STREX без включенного SCU?
В идеальной вселенной ARM, да, это возможно. То есть возможно, что где-нибудь когда-нибудь вы сможете это сделать. Я думаю, что вы имеете в виду,
Могу ли я использовать LDREX/STREX без SCU в моей системе?
К сожалению, ARM ARM - это немного политический / бюрократический документ. Вы должны быть предельно осторожны при чтении "настоятельно рекомендуется", "непредсказуемо", "НЕИЗВЕСТНО" и можете. Все программисты хотели бы ldrex/strex
применить ко всей памяти. На самом деле, если в контроллере BUS (обычно AXI-NIC) реализован монитор, то не будет проблем с поддержкой столь любимого swp
инструкция. В Stackru есть различные посты, где люди хотят заменить swp
с ldrex/strex
,
После того, как вы прочитали и перечитали двойную речь (написанную для программиста, а также кремниевого разработчика) ARM ARM, становится довольно ясно, что логика монитора, вероятно, реализована в кеше. Контроллер кэша должен реализовывать грязные широковещательные сообщения. Широковещательные трансляции очень похожи на "монитор", а ваша "резервная гранула", скорее всего, имеет размер строки кэша (что такое совпадение).
ARM ARM написан как общий документ для людей, которые могут захотеть внедрить процессор Cortex-A. Написано так, что своими руками (креативность) не привязаны к реализации монитора с - в кеше.
Так что вам нужно прочитать конкретную документацию по вашему конкретному SOC Cortex-A9. Это, вероятно, будет только поддерживать ldrex/strex
с кэшированной памятью. На самом деле, желательно оформить pld
чтобы убедиться, что память находится в кеше, прежде чем делать ldrex
и это будет означать, что вам нужно активировать SCU в вашей системе. Я полагаю, вас беспокоит какой-то дополнительный цикл (циклы), который SCU добавит к задержке?
Я думаю, что часть этой информации смутила многих чрезвычайно умных людей. Остерегайтесь разницы между возможным и есть. Каждый сотрудник Stackru, вероятно, желает, чтобы монитор был встроен в контроллер шины (или чип памяти ядра). Однако для большинства реальных фишек это не так.
Наверняка, если вы хотите, чтобы ваш код / операционная система обеспечивала портирование в будущем на новые или другие процессоры Cortex-A, вы не должны делать это предположение, даже если ваш набор микросхем поддерживает "глобальный монитор" вне подсистем кеша.