2012-05-28 1 views
0

Windows에서 Linux로 코드를 이식합니다 (Red Hat Linux 또는 Fed). 기존 코드에서 (UNALIGNED * 데이터 유형) 참조를 갖는 코드를 찾았습니다.LINUX (Windows에서 Linux로 이식)에서 UNALIGNED 메모리 액세스가 필요합니까?

알려주세요. 1) Linux로 이식 할 때 1) 무기한 메모리 액세스가 필요합니다. 2) 필요한 경우 어떻게 할 수 있는지 알려주십시오.

저는 리눅스 버전을 둘러 보았습니다. 나는 arm/unaligned.h를 사용했다. 파일을 추가하려고하면 "No such file or directory"라는 오류 메시지가 나타납니다.

감사합니다.

답변

1

정렬은 운영 체제의 문제가 아니라 CPU 제한 사항입니다. x86 CPU는 정렬되지 않은 액세스를 수행 할 수 있으며 (성능상의 불이익을 감안할 때) 정렬 된 포인터가 아닌 다른 것으로부터 단어를로드하려고하면 동일한 Linux (또는 다른 버전)에서 버스 오류가 발생합니다.

MSVC의 UNALIGNED 키워드는 x86에서 알고있는 한 noop입니다. 다른 아키텍처에서는 액세스가 성공적으로 완료되었는지 확인하기 위해 더 복잡한 명령 시퀀스를 내 보냅니다. gcc와 동등한 것을 찾고 있습니까? 나는 하나가 존재한다고 믿지 않는다.

+0

저는 리눅스 x86에서 정렬되지 않은 액세스로 인해 SIGBUS를 제기했다고 확신합니다. 그것은 CPU가 그것을 처리 할 수 ​​있지만, 그것은 기본적으로 리눅스에서 (또는 당신의 pov에 따라) 스위치가 켜져 있지 않을 수 있습니까? –

+0

@ AndrewTomazos-Fathomling : 일부 SSE 지침에는 정렬 된 주소가 필요합니다. 아마도 그 주소를 사용했을 것입니다. – janneb

1

최근 gcc하면

__attribute__ ((__packed__))를 사용하는 것이 좋습니다하지만 가능하면 그것을 사용하지 않는 것이 좋습니다. 컴파일러는 필드를 정렬하는 데 아주 능숙합니다. 그리고 ABI는 조정을위한 규칙을 정의 할 수 있습니다.

소스 코드가 UNALIGNED 인 이유를 이해해야합니다. 데이터가 외부에서 정의 된 형식을 갖거나 "성능"이유로 사용 되었기 때문입니까? 컴파일러에 최적화를 남겨주세요!

+0

그것들은 다른 것들입니다. UNALIGNED는 포인터에 대한 속성이며 포인터가 (런타임에) 자연스럽게 정렬되지 않은 주소로로드하거나 저장하는 데 사용될 수 있다고합니다. "묶음"은 구조 필드가 메모리에 배열되는 방식을 변경하는 구조의 특성입니다. 그것들은 관련 개념입니다 (즉, packed는 정렬되지 않은 구조체 필드를 생성합니다). 그러나 이것을 사용하여 다른 것을 에뮬레이트 할 수는 없습니다. –

관련 문제