2016-11-01 2 views
1

THUMB2 참조는 대상 주소가 4 바이트 정렬되지 않은 경우 LDR PC, [PC, #imm] (유형 2)이 예측할 수 없도록 지정합니다.엄지 손가락의 "ldr pc, [pc, #imm]"가 예측할 수없는 이유

내 경험에 비추어 볼 때, 일부 프로세서에서는이 기능이 완벽하게 작동하고 다른 일부에서는 비참하게 실패합니다 (이 때문에 정렬 문제에 대한 오류를 추적하는 데 오랜 시간이 걸렸습니다).

그래서 ("그냥하지 마세요") 여기에 대한 실제 설명이 있는지 궁금합니다.

+1

4 바이트 정렬이 아닌 경우 가능한 경우 ** 메모리 액세스가 여러 사이클 ** 걸릴 수 있습니다. Esp 시스템에 캐시가없는 경우 (cortex-m, thumb2 만 지원) 4 바이트 정렬 PIC 데이터를 패드하는 것은 상당히 쉽습니다. 따라서 일부 ARM/Thumb2 시스템은 정렬되지 않은 메모리 액세스를 수행하지 않고 설계되었을 수 있습니다. 트랜지스터 수와 파이프 라인은 단순화 될 것이다. thumb2 어셈블리 기술은 모든 사례를 처리하고 CPU/SOC 설계자에게 유연성을 제공하기 위해 작성되었습니다. –

+0

빠른 응답을 보내 주셔서 감사합니다. 그러나 아직 얻지 못했습니다. 목적지 레지스터가'pc'가 아닌 경우 주소가 정렬되지 않는 것이 왜 괜찮습니까? 또한 ARM의 내부 동작에 대한 독서 자료를 권해 주실 수 있습니까? 그것은 내가 정보가 부족한 것일 수도 있습니다. 강조하기 위해, 나는 해결책을 찾지 않고있다. (그것은 매우 간단하다.) 나는 그 문제를 이해하기를 원한다. –

+0

'PC'는 다음 명령을 가져올 곳을 요구하기 때문에 특별합니다. 'ldr'가 정렬되어 있지 않다면 다중 버스/메모리 사이클이 필요할 수 있습니다. 그리고 CPU에 "우리는 어디에 있는지 모르겠고, 모든 것을 멈추십시오"라고 말할 필요가 있습니다. 이것은 논리/트랜지스터/복잡성입니다. –

답변

1

내가 생각하기에 주된 이유는 PC 나 SP를로드하는 명령은 부작용이 있으며 CPU에서 (효율적으로) 관리하기가 어렵다는 것입니다. ARM 명령어 세트 이후, 새로운 명령어 세트 (Aarch64 포함)는 이러한 부작용이있는 명령어를 제한합니다.

2

과 같은 ARM 언어를 사용하면 과거 또는 현재의 어느 시점에서 작동하지 않는 특정 핵심이 있음을 의미하는 경우가 종종 있습니다. 그래서 그냥하지 마. 핵심과 완벽하게 작동 할 수 있습니다. 그것은 명령 집합과 관련이있을 수도 있고 아닐 수도 있습니다. 그들은 문을두기를 원할 경우 언제든지 명령을 작동시킬 수 있습니다. 그렇기 때문에 하나 이상의 특정 구현에 문제가 있고 발견되기 전에 이미 배포 된 것일 가능성이 큽니다.

예전에는 ARM이 있었지만 여전히 사실 일지 몰라도 실제로 예측할 수있는 코드를 구현 한 경우이 언어를 사용하고 도난당한 코드를 사용하고 있는지 확인하는 데 사용합니다 또는 무엇이든. ARM 종류의 것을 복제했다면 무엇을 커버 할 것인가. 내 생각에 피코 터보는 그것을 거의 덮어서 잠자리에 들었다. ARM의 법률 팀은 지금 당장 짧은 작업을합니다.

특히 프로그램 카운터는 조금 복잡하고 파이프 라인이있는 esp입니다. 두 가지 일은 지금 도토리 시대 이후로 모두 합성되었습니다. 특정 경우 (PC 상대로드, 점프 테이블 등)를 제외하고 쉼표의 오른쪽에있는 PC를 사용하는 것이 일반적으로 좋지 않기 때문에 PC와 관련하여 그런 종류의 언어를 볼 수 있습니다. 그 명령을 만들기 위해 코드와 클럭 사이클을 추가하면 오른쪽의 pc로 작업 할 수 있습니다. 이 경우 (PC 상대 부하) 다시 한 번 문제가있는 하나 이상의 구현을 잘라내어 붙여 넣거나 성능 또는 게이트 수 또는 타이밍 클로저 이유로 인해이 규칙을 적용했습니다. 타이밍 클로저는 디자인이 텐트의 가장 긴 극만큼 빠르게 작동 할 수 있으므로 가장 길고 시간이 많이 걸리는 조합 신호는 제조 및 온도 및 기타 환경 요인과 마진의 변화를 해결합니다. 따라서 테이프를 계산하기 전에이를 검사하고 결정하십시오.이를 두 개 또는 그 이상의 시계로 나누고 싶습니까? 특정 기능에 연결되어 있습니까?이 기능을 제거하기 만하면됩니까? 예상 최대 클록 속도가이 제품에 대해 예상 한 것 이상이 될 때까지 합성 및 타이밍 폐쇄를 반복하십시오.

이 경우 정렬되지 않은 액세스를 트랩하지 않았을 수 있습니다. 4 바이트 정렬은 정렬되지 않은 액세스가 아니며, 트랩되거나 왜 그럴지를 가정 할 경우 제대로 구현되지 않았을 수 있습니다. 어쩌면 그것을 시험해 볼 수 있습니다. 정렬되지 않은 주소의 양쪽에 특정 바이트를 가져 가거나 심은 다음 착륙 할 수있는 위치의 조합에 코드를 심어줍니다. 당신이 칩 벤더가 아니라면, 칩 밴더로서 이것을 꼭 볼 수는 없지만, 칩 벤더로서 이것을 정확히 시뮬레이션 할 수있을 것이고, 무슨 일이 일어나고 있는지 정확히 알 수있을 것이다. 네가 그 일을하는 사람이 없다면 그건 효과가 없다.

초기 ARM 팔 (ARMv4T 이상/ARMv5T 일부의 ARMv6)에서 보면, 이것은 더욱 제네릭 LDR 온, []

메모리 어드레스는 워드로 정렬되지 않고, 데이터가 발생을 중단하지 않으면 대상 레지스터에 쓰여진 값은 UNPREDICTABLE이다.

심지어 하나 이상의 레지스터로 PC를 사용하지도 않습니다.

TL; 매우 가능성이 높은 것은 두 가지 중 하나입니다. 1) 버그가 있거나 적어도 같은 제품군 또는 다른 디자인의 코어에 고정 된 하나 이상의 코어가 있습니다. 2) 정렬되지 않은 액세스를 구현하고 예측할 수없는 가비지를 생성하는 것을 바람직하지 않게 만든 설계 이유 (종종 타이밍/성능)가 있지만 어쨌든 결과가 무엇인지에 대한 긴 설명의 가치가 없습니다. .

한 코어에서 한 번만 작업했기 때문에 항상 작동한다는 것을 의미하지는 않습니다. 문제의 핵심 코드와 함께 운이 좋아질 수 있습니다. 정오표에 액세스 할 수 있으면 이유와 수정 사항에 대한 답을 찾을 수 있습니다. 엄지 손가락은 ARMv4T에서 현재까지의 모든 암 코어에서 지원되며 그 중 많은 코어는 처음부터 수정됩니다. 수정 사항이없는 한 정오표에서 찾을 수 있기 때문에 다른 디자인이이 작업을 수행하지 않는다는 문서에 의존한다는 것을 의미합니다. 성가 시게해라.