LDREX/STREX — это то, что должен реализовать производитель чипа, надеюсь, в соответствии со спецификацией оружия. Вы можете и должны получить документацию по армам по теме, в этом случае в дополнение к армам и trms вы должны получить документацию amba-axi.
Итак, если у вас есть
ldrex thread 1
interrupt
ldrex thread 2
strex thread 2
return from interrupt
strex thread 1
Между потоком 2 ldrex и strex не было изменений в этой области памяти, поэтому strex должен работать. Но между потоком 1 strex и предыдущим ldrex произошла модификация этого местоположения, поток 2 strex. Таким образом, теоретически это означает, что поток 1 strex должен дать сбой, и вам придется снова попробовать свою пару потока 1 ldrex/strex, пока она не заработает. Но это именно так, вы продолжаете пробовать пару ldrex/strex в цикле, пока не добьетесь успеха.
Но все это определяется реализацией, поэтому вам нужно смотреть на конкретного поставщика чипа, модель и версию и проводить свои собственные эксперименты. Ошибка в linux, например, заключается в том, что ldrex/strex представляет собой бесконечный цикл, применив его к системе/ситуации, где ldrex/strex не поддерживается, вы получите OKAY вместо EXOKAY, и strex навсегда выйдет из строя, вы застряли в этом бесконечный цикл навсегда (всегда удивляюсь, откуда я все это знаю, пришлось отлаживать эту проблему на логическом уровне).
Во-первых, ARM документирует, что поддержка монопольного доступа не требуется для однопроцессорных систем, поэтому пара ldrex/strex МОЖЕТ не работать, ЕСЛИ вы коснетесь специфической логики поставщика в одноядерных системах. Однопроцессорный или нет, если ваш ldrex/strex остается в пределах логики руки (кеши L1 и дополнительные кэши L2), тогда пара ldrex/strex управляется ARM, а не поставщиком чипа, поэтому вы подпадаете под один набор правил, если пара касается системной памяти. вне ядра руки, то вы подпадаете под правила поставщиков.
Большая проблема заключается в том, что документация ARM необычайно неполна по этой теме. В зависимости от того, какое руководство и где в руководстве вы читаете, например, говорится, что какой-то ДРУГОЙ мастер изменил это местоположение, которое в вашем случае является тем же мастером, поэтому местоположение было изменено, но поскольку это было вами, второй strex должен быть успешным . Затем в том же документе говорится, что еще одно монопольное чтение сбрасывает монитор на другой адрес, а что, если это еще одно монопольное чтение того же адреса?
По сути, ваш вопрос заключается в том, что насчет двух эксклюзивных записей на один и тот же адрес без эксклюзивного чтения между ними, делает ли / должен ли второй успех. Очень хороший вопрос... Я не вижу однозначного ответа ни во всех ядрах рук, ни во всем мире чипов на основе рук.
Суть в том, что ldrex/strex не полностью зависит от ядра ARM, но также зависит от чипа (поставщика). Вам нужно провести эксперименты, чтобы убедиться, что вы можете использовать эту пару инструкций в этой системе (однопроцессорной или нет). Вам нужно знать, что делает ядро ARM (кеши) и что происходит, когда этот эксклюзивный доступ выходит за пределы ядра к логике поставщика. Повторите для каждого ядра и поставщика, которому вы хотите перенести этот код.
person
old_timer
schedule
28.05.2014
LDRX/STRX
, вы должны сделать то же самое в прерываниях.LDRX
резервирует место в памяти. ЧтобыSTRX
сигнализировал о повторной попытке, каждый, кто использует память, должен использоватьLDRX
; вы не можете смешивать и сочетать доступ.MRC p15, 0, <Rd>, c0, c0, 1
возвращает ERG, то есть размер, которыйLDRX/STRX
резервирует. Прочитайте об эксклюзивных мониторах. - person artless noise   schedule 28.05.2014LDRX/STRX
немного чужды. Что касается вопроса Linux atomic_inc, я думаю, вы думаете о атомном и без блокировки; см. там мой вики-ответ, за который проголосовали против. - person artless noise   schedule 28.05.2014