2011-03-01 3 views
2

Linux 커널을 실행하는 ARM Cortex A-8 장치에서 몇 가지 실험을하고 있습니다.ARM 잠금 레지스터 쓰기 작업으로 장치가 충돌합니다.

I 액세스하고 문제없이 L2 캐시 잠금 레지스터의 값을 판독 할 수

ASM 휘발성 ("MRC P15, 1 % 0, C9, C0, 0" '= R "(I)); I 값을 다시 쓰기 할 때

, 장치는 즉시 충돌 :

ASM 휘발성 ("MCR의 P15, 1 % 0, C9, C0, 0": "R"(I));

코드가 커널 모듈로 실행되므로 사용 권한 문제가 없습니다.

그 레지스터 값을 쓰기 전에 특별한 것이없는 것일까 요?

답변

3

캐시 잠금으로 게임을 할 때주의해야 할 긴 체크리스트가 있습니다. ARM의 정보 센터에는 몇 가지 팁이 있습니다. http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344i/Chdeghcb.html

특히 인터럽트를 사용하지 않도록 설정하고 적절한 지침/데이터를 무효화하십시오. 또한 읽기/쓰기 액세스가 활성화되어 있는지 확인하십시오. 커널 모드에 있어도 읽기/쓰기 액세스가 가능하지 않을 수 있습니다. 중요한 포인트에서 코드가 페이지 또는 캐시 라인을 넘지 않도록해야합니다. 그것은 이 정말 까다 롭습니다.입니다. 캐시 방식을 잠그고 모든 것이 제대로 작동 할 것으로 기대할 수는 없으며 C의 인라인 ASM으로 수행 할 수 없습니다.

최악의 경우 내부 상태 머신이 L2 캐시 컨트롤러를 사용하여 잘못된 데이터를 잠그고 데이터가 모두 캐싱되지 않도록하고 모든 작업을 중단 시키거나 태그 동기화를 해제합니다. 그 사고를 설명해 줄거야.

또한 실험입니까 아니면 성능을 향상 시키려고합니까? DRAM/버스에 잘 어울린 코드 시퀀스를 건드리는 것을 피하는 데 유용합니다. 예를 들어 (딥 슬립) 해제하려는 경우와 같이 대개 성능이 좋지는 않습니다.

+0

또한 장치에서 코어의 개정판을 찾으십시오. ARM의 웹 사이트에서 Cortex A-8의 개정판에 대한 정오표를 확인하십시오. 놀랍게도 큰 정오표가 있는데, 대부분 사용자가 아닌 사람이 보입니다.하지만 시스템을 가지고 놀고 있습니다. :) –

관련 문제