소스 코드를 Linux를 실행하는 ARM 플랫폼으로 이식해야합니다. 불행히도 정렬되지 않은 메모리 액세스 문제가 발생했습니다. 소스는 포인터 캐스트와 액세스를 많이 사용합니다.ARM 정렬되지 않은 메모리 액세스 해결 방법
아래 코드는 바이러스와 같은 코드베이스에 퍼져 있습니다. gcc -Wcast-align
명령 줄 옵션 덕분에 문제가있는 위치를 찾아 낼 수 있지만 수천 개가 넘는 인스턴스가 있습니다. echo 2 > /proc/cpu/alignment
에 사용
u = (IEC_BOOL);
(((*(IEC_LINT*)pSP).H < b.H)
|| (((*(IEC_LINT*)pSP).H == b.H) && ((*(IEC_LINT*)pSP).L < b.L))) ? 1 : 0);
*(IEC_DWORD OS_SPTR *)pSP =
(IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP >> u);
*(IEC_DWORD OS_SPTR *)pSP =
(IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP << -u);
u = (IEC_BYTE)((*(IEC_DINT*)pSP != b) ? 1 : 0);
*(IEC_DWORD*)pSP = (IEC_DWORD)(*(IEC_DWORD*)pSP & w);
(*(IEC_ULINT*)pSP).H += u.H;
(((*(IEC_ULINT OS_SPTR *)pSP).H == b.H)
&& ((*(IEC_ULINT OS_SPTR *)pSP).L > b.L))) ? 1 : 0);
u = (IEC_BYTE)((*(IEC_REAL*)pSP >= b) ? 1 : 0);
는 리눅스 커널이 문제를 해결하지만, 응용 프로그램의 성능이 더 이상 허용되지 않는 지점으로 저하한다.
GCC (v4.4.1) 컴파일러에 대해 __unaligned
또는 __packed
키워드를 검색했지만 아직 비어 있습니다.
많은 Poblematic 코드 라인이 다소 복잡한 정규 표현식/대체 코드로 고정 될 수 있다고 생각했지만 지금은 그렇게하고 난 후에도이 접근법은 엄청난 양의 지루한 작업을 수행하게됩니다.
이 작업을 수행하는 방법에 대한 제안 사항이 있으십니까? gcc 4.5 컴파일러 플러그인은 과도하다고 생각하지만 정규 표현식보다 나은 점이 있습니까? 어떤 다른 제안을 할 수 있습니까? 몇 가지 드문 경우 커널에 의존 할 수 있기 때문에 반드시 모든 문제 인스턴스를 수정해야하는 것은 아닙니다.
나는 이것을 TheDailyWTF.com으로 옮겨야한다는 농담을하고 싶다. – Crashworks
현대 언어학에 대한 우리의 연구를 계속하면서, 우리는 임베디드 프로그래머가 일반적으로 사용하는 C 언어의 표본을 가지고 있습니다. 대략 영어로 번역 된 위의 텍스트는 "F *** YOU!"를 의미합니다. 자연 언어는 아무리 위선적 인 것에도 불구하고 양심적 인 가치를 전달할 수는 없지만 여기에 전달 된 독자의 인성에 대해서는 무시합니다. – Dmitri