2016-11-01 6 views
1

Ссылка THUMB2 указывает, что LDR PC, [PC, #imm] (тип 2) непредсказуем, если целевой адрес не выровнен по 4 байт.Почему «ldr pc, [pc, #imm]» в большом пальце непредсказуем

По моему опыту, на некоторых процессорах это работает отлично, а на других оно терпит неудачу (именно поэтому мне потребовалось некоторое время, чтобы проследить эту проблему).

Так что мне было интересно, если есть какое-то реальное объяснение этому (за исключением «просто не делай этого»).

+1

Если он не выровнен по 4 байт, доступ к памяти может занять несколько циклов **, если это возможно **. Esp, если в системе нет кеша (cortex-m, который поддерживает только файл thumb2). Достаточно легко отложить до 4 байтов данных PIC. Таким образом, некоторые системы ARM/Thumb2 могут быть сконструированы без возможности делать неприглаженный доступ к памяти. Счет транзистора и трубопровод будут упрощены. Технический сборник thumb2 написан для обработки всех случаев и дает разработчикам CPU/SOC некоторую гибкость. –

+0

Спасибо за быстрый ответ, но я пока не совсем понял. Почему это нормально для того, чтобы адрес был неравнозначным, если регистр назначения не 'pc'? Кроме того, можете ли вы порекомендовать некоторые материалы для чтения о внутренней работе ARM? Возможно, я просто пропущу какую-то информацию. Чтобы подчеркнуть, я не ищу решения (так как это довольно просто), я просто хочу понять проблему. –

+0

«ПК» является особенным, так как требует, чтобы следующая команда была извлечена. Если 'ldr' не выровнен, может потребоваться несколько циклов шины/памяти, и вам нужно будет что-то сказать CPU:« Я не знаю, где мы, остановите все », что является логикой/транзисторами/сложностью. –

ответ

1

Основная причина (я думаю) заключается в том, что инструкции, которые загружают ПК или SP, имеют побочные эффекты и им трудно управлять (эффективно) в ЦП. Поскольку набор инструкций ARM, набор новых инструкций (включая Aarch64) ограничивает инструкции, которые имеют эти побочные эффекты.

2

С таким языком ARM часто означает, что в какой-то момент в прошлом или настоящем они имеют определенное ядро, где оно не работает. Так что просто не делай этого. Может отлично работать с вашим ядром. Он может или не может иметь ничего общего с набором инструкций, они всегда могут заставить эту инструкцию работать, если они хотят, выровнены или нет, просто вопрос о том, чтобы закрыть ворота. Именно поэтому в большинстве случаев вероятность того, что одна или несколько конкретных реализаций будет иметь проблемы, была уже выпущена до ее обнаружения.

В старые времена с ARM и все еще может быть правдой, что они вставляют этот язык, когда они специально внедряют то, что на самом деле предсказуемо, и используют его как способ увидеть, используете ли вы украденный код или что-то еще. Чтобы покрыть то, что, если вы клонируете ARM. Я думаю, что picoTurbo в значительной степени покрыл это и уложил его в постель. Юридическая команда ARM сейчас делает короткую работу.

Счетчик программ, в частности, немного грязный, esp с конвейерами, две вещи впереди, все синтезированные сейчас, вероятно, были с тех пор. Просто плохая идея в целом использовать ПК с правой стороны запятой, за исключением конкретных случаев (относительные нагрузки pc, таблицы перехода и т. Д.), Поэтому вы можете видеть такой язык по отношению к ПК просто так, чтобы у них не было для добавления циклов кода и тактов, чтобы эта команда просто работала с компьютером справа. В этом случае (относительная нагрузка pc), опять же, они, вероятно, имеют одну или несколько реализаций, вырезанных и вставленных друг от друга, у которых есть проблема, или для оценки производительности или ворот или причин закрытия таймера, они сделали это правило. Сроки закрытия, ваш дизайн может работать только быстрее, чем самый длинный полюс в палатке, самый длинный, временный, комбинационный сигнал, чтобы уладить колебания в производстве и температуре и другие факторы окружающей среды плюс запас. Поэтому перед записью вы их вычислите, рассмотрите их и решите, хотим ли мы разделить это на два или более часов, привязаны ли они к определенной функции, хотим ли мы просто удалить эту функцию. Повторите синтез и синхронизацию до тех пор, пока ожидаемая максимальная тактовая частота не будет выше ожидаемого для этого продукта.

Возможно также, что в этом случае они не захватили неравномерный доступ, а не выровненный по 4 байта, это неравномерный доступ, и они могут быть неправильно реализованы, полагая, что они будут пойманы в ловушку или кто знает почему. Вы можете попробовать проверить это. Принимая или устанавливая конкретные байты по обе стороны от неувязанного адреса, а затем устанавливая код в комбинациях, где это может приземляться. Если вы не являетесь продавцом чипов, вы не видите этого в противном случае (если он не ловушка), как поставщик чипов, вы могли бы симулировать это и точно видеть, что происходит, конечно, у вас также будет код и посмотрите, почему он не работает, если у вас есть тот, который не работает.

Глядя в начале ARM ARM (ARMv4T/ARMv5T и некоторые ARMv6), это еще более общие на LDR, [,]

Если адрес памяти не слово выровнено и никаких данных не прерывать происходит, значение, записанное в регистр назначения, НЕПОЛНОЕТ.

Не может даже использовать ПК как один или несколько регистров.

TL; DR. Скорее всего, это одна из двух вещей: 1) у них есть по крайней мере одно ядро, которое имеет ошибку, зафиксированное в более поздних ядрах того же семейства или других конструкций. 2) У них есть причина дизайна (часто время/производительность), из-за чего нежелательно реализовать неравномерный доступ и позволить ему производить мусор, скорее всего, не непредсказуемый, но не стоит длинного объяснения того, что результат такой, поскольку он в любом случае не помогает ,

Просто потому, что он работал на одном ядре один раз для вас, это не значит, что он всегда работает, вам может повезти с кодом и ядром. Если у вас есть доступ к ошибкам, вы можете найти ответ как по причине, так и по исправлению. Thumb поддерживается на всех кронштейнах от ARMv4T до настоящего времени, и многие из этих ядер делаются с нуля, поэтому просто потому, что вы находите его в одной ошибке с исправлением, не означает, что другие проекты полагались на документацию, говорящую, что не делайте этого и не сделали чтобы заставить его работать.