필자는 기본적으로 리틀 엔디안 인 ARM 프로세서에서 iPhone (및 iPad)을 실행한다는 것을 알고 있습니다. Wikipedia 페이지에 따르면 iOS 자체는 리틀 엔디안입니다. 그러나 ARM 프로세서는 리틀 엔디안과 빅 엔디안간에 전환 할 수있는 기능이 있다고 생각합니다. 이것이 어떻게 가능하며 어떻게 작동합니까?
필자는 기본적으로 리틀 엔디안 인 ARM 프로세서에서 iPhone (및 iPad)을 실행한다는 것을 알고 있습니다. Wikipedia 페이지에 따르면 iOS 자체는 리틀 엔디안입니다. 그러나 ARM 프로세서는 리틀 엔디안과 빅 엔디안간에 전환 할 수있는 기능이 있다고 생각합니다. 이것이 어떻게 가능하며 어떻게 작동합니까?
답변:
당신이 누군가가 할 수있는 엔디안을 알 필요가 없다고 생각하더라도. 문맥을 모르기 때문에 왜 누군가가 필요하지 않은지 설명 할 필요가 없습니다. 문제는 "엔디안을 알아야 하는가"가 아니라 "엔디안이 크거나 작은가"입니다. 주제에 집중하세요!
바퀴를 재발 명하지 않고 Apple이 제공하는 매크로에 의존하는 것이 가장 좋은 방법 일 것입니다. 그 이유는 매크로를 최적화하는 데 많은 시간을 소비했으며 Mac, iPhone 및 모든 OS 및 하드웨어뿐만 아니라 시뮬레이터에서도 잘 작동하기 때문입니다.
호출 CFSwapInt16BigToHost
할 때 발생하는 상황을 자세히 살펴보면 이러한 매크로가 컴파일러 최적화를 통해 얻을 수있는 최상의 머신 코드를 생성하고 있음을 나타내는 주석을 볼 수 있습니다.
OS_INLINE
uint16_t
_OSSwapInt16(
uint16_t data
)
{
/* Reduces to 'rev16' with clang */
return (uint16_t)(data << 8 | data >> 8);
}
OS_INLINE
uint32_t
_OSSwapInt32(
uint32_t data
)
{
#if defined(__llvm__)
data = __builtin_bswap32(data);
#else
/* This actually generates the best code */
data = (((data ^ (data >> 16 | (data << 16))) & 0xFF00FFFF) >> 8) ^ (data >> 8 | data << 24);
#endif
return data;
}
엔디안 (Endianness)은 최종 사용자와 실제로 상호 작용하는 것이 아니라 애플 제품 사용자에게 이것이 의미하는 바를 10,000 피트 요약 한 것입니다.
간단히 말해서 내부 프로세서의 엔디안은 언어의 쓰기 방향과 동일합니다. 영어 텍스트의 글자를 볼 때, 우리는 모두 왼쪽 상단에서 시작하여 먼저 오른쪽에서 아래로 읽는 것에 동의합니다. 다른 언어는 오른쪽에서 시작하여 왼쪽으로 읽고 일부는 먼저 왼쪽이나 오른쪽으로 이동하기 전에 아래로 읽습니다 .
주소 또는 숫자의 내부 표현에있는 비트가 리틀 엔디안 또는 빅 엔디안으로 저장되는 경우 실제로 사용자에게 중요하지 않습니다. 실제로 Mac의 OS X는 빅 엔디안 표현을 따르고 iOS는 리틀 엔디안 순서를 따릅니다 . 이 사실이 두 장치가 제대로 작동하지 않는다는 의미는 아닙니다. 이 표현은 내부적으로 만 발생하며 사용자로서 우리에게 노출되지 않기 때문에 작동합니다.