2014-09-11 2 views
5

PowerPC에서 작동하는 거대한 소스 코드가 있습니다. ARM에 포팅해야합니다. 그러나 ARM은 정렬되지 않은 메모리 액세스에 대해 h/w 예외를 생성합니다. 그래서, 정렬되지 않은 메모리 액세스 예외가 발생할 수있는 모든 가능한 인스턴스를 찾고 싶습니다. 다음 옵션을 고려했습니다.PowerPC에서 정렬되지 않은 메모리 액세스 예외 생성

  1. 정렬되지 않은 액세스에 대한 경고를 발생시키는 gcc에서 -Wcast-align을 사용하십시오.
  2. PowerPC가 정렬되지 않은 예외를 생성하도록하십시오. ARM의 경우 사용자가 예외 처리 방법을 결정할 수있는/proc/cpu/alignment 옵션이 있습니다. 그러나 PowerPC에는 이러한 옵션이 없습니다.

내 질문

  1. 는 파워가 정렬되지 않은 메모리 액세스 예외를 생성 할 수있는 방법이 있나요이다?
  2. 소스 코드에서 정렬되지 않은 모든 메모리 액세스를 확인하는 더 좋은 방법이 있습니까?
+0

PowerPC가 정렬되지 않은 메모리 액세스 예외를 생성하는 방법 - 커널의 일부 옵션 (CONFIG_ALIGNMENT_TRAP 등)? – someuser

+0

또한 포트를 잡고 잡아서 고칠 수 있습니다. :) – someuser

+0

PowerPC는 항상 AltiVec로드/저장을 제외하고 정렬 예외를 생성합니다. 물론 OS가 자동으로 이러한 예외를 처리 할 수도 있지만 그 또 다른 이야기입니다. –

답변

2
  1. 그것은 당신의 PowerPC 프로세서에 따라 달라집니다. POWER8과 같은 하이 엔드 서버 프로세서는 정렬 예외를 생성하지 않습니다. 즉, 정렬 예외를 더 자주 발생 시키려면 HID SPR 비트가 있습니다. 어느 쪽이든, 리눅스에서는 커널이 커널을 처리 할 것이고 사용자는 성능 손실 이외에 커널을 볼 수 없습니다. prctl (PR_UNALIGN_SIGBUS)을 설정하면 커널이이를 처리하는 대신 SIGBUS를 생성하게됩니다.

  2. perf 이벤트가있는 Linux에서 alignment-faults 이벤트를 사용할 수 있습니다. 예 : "perf stat -e 정렬 오류 테스트 케이스". 또한 CONFIG_PPC_EMULATED_STATS를 켜면 "emulated_instructions"라는 디버그 항목에 정렬되지 않은 액세스 항목이 있습니다.

+0

이 모든 것을 수행하는 대신, -Wcast-align을 사용하여 컴파일하고 모든 문제점을 수정하는 것이 더 낫지 않습니까? – linuxfreak

+0

예, 가능한 경우이를 피하는 것이 가장 좋습니다. 때로는 가능하지 않지만 확인하고 싶을 수도 있습니다. –

2
  1. 예. 아니오. PowerPC 하드웨어에는 하드웨어에서 32 비트 정렬되지 않은 액세스가 있으며 쉽게 재정의 할 수 없습니다. 그러나 OS에서와 달리 "베어 메탈"을 사용하는 경우 메모리 영역을 I/O 공간으로 매핑하여 예외를 생성 할 수 있습니다. 이 방법은 복잡하지만 코드를 직접 검토하는 편이 좋습니다.

    64 비트 액세스의 경우 대부분의 PowerPC는 정렬되지 않은 액세스에 대해 이미 예외를 생성합니다. 하드웨어에 해당하는 경우 트랩 할 수 있습니다. 다시 이것은 커널에서 일어날 필요가 있습니다. 따라서 OS 하에서 실행한다면 쉽게 할 수 없습니다 (커널은 소프트웨어에 대한 정렬되지 않은 액세스를 처리 할 것입니다).

  2. 실제로 이것은 포인터 연산을 많이 수행하는 경우 특히 실행 시간에 결정될 수 있습니다.

+0

1) "베어 메탈"이 아닌 OS에서 실행하고 있습니다./proc/cpu/alignment 항목을 만들고 커널에서 예외를 처리 할 수 ​​있습니까? 2) 런타임에 다른 방법이없는 것처럼 보입니다. 그렇다면 정적 분석기 도구를 사용하여 모든 인스턴스를 찾을 수 있습니까? – linuxfreak

+2

실패한 액세스를 에뮬레이션하여 커널에서 이러한 종류의 예외를 처리 할 수 ​​있습니다. 이것은 MIPS에서도 마찬가지입니다. 그러나 성능에 큰 불이익이 있으므로 최선의 방법은 소스 코드에서 최대한 많은 수의 코드를 제거하고 에뮬레이션을 백 스톱 (back-stop)으로 사용하는 것입니다./proc fs에 노출 된 정렬되지 않은 액세스에 대한 카운터를 가질 수 있으며, 액세스가 발생한 주소를 기록한 다음 소스 코드에서 소급 수정 할 수도 있습니다. 나는이 모든 것을 잡을 수있는 정적 분석 도구에 대해서는 잘 모르고 있으며 100 % 할 수 있다고 생각하지 않습니다. – ThomasH

관련 문제