Endianness iPhone'ów?

10

Wiem, że iPhone'y (i iPady) działają na procesorach ARM, które domyślnie są little-endian (a sam system iOS jest little-endian zgodnie ze stroną Wikipedii); jednak procesory ARM podobno mają zdolność przełączania między little-endian i big-endian. Jak to możliwe i jak to działa?

slartibartfast
źródło
1
W jaki sposób odpowiedź na to pytanie pomogłaby rozwiązać problem lub poprawić wrażenia z korzystania z iPhone'a? Jeśli rozwiązuje jakieś rzeczywiste obawy użytkowników końcowych niebędących programistami, nie ma znaczenia, jak jest to techniczne, ale jeśli pytanie jest interesujące tylko dla programistów, jest tutaj nie na temat.
Daniel
Ok, to czy powinienem przenieść go do stackoverflow?
slartibartfast
2
@myrkos Lub superuser.com
Dan J
6
Najpierw wyostrzmy pytanie. Szukamy krótkich pytań, które zapraszają na długą odpowiedź. Dotyczy to wszystkich stron. SuperUser nie jest miejscem na jakiekolwiek pytania dotyczące iOS. Jesteśmy najlepszym miejscem na pytania dotyczące sprzętu w systemie iOS. Jeśli masz konkretny problem z programowaniem, odpowiedz na to pytanie i wyjaśnienie, w jaki sposób endianność sprzętowa systemu iOS wpływa na twoje konkretne pytanie dotyczące programowania [SO, a tutaj nie ma forum]. Jeśli chcesz spojrzeć na tę kwestię z perspektywy użytkownika, trudno zauważyć, że żadna witryna nie jest lepszym miejscem do przechowywania tego pytania niż tutaj.
bmike
2
„ARM jest nieco endianową, 32-bitową architekturą RISC szeroko stosowaną przez urządzenia mobilne. Muszę tu zanotować: ARM to bi-endian (bajtseksualny, jeśli chcesz); możesz przełączać endianowość z najniższego poziomu. po prostu zdarza się, że iOS używa go jako małego endiana. Wydaje mi się, że pamiętam układ pasma podstawowego (który jest również rdzeniem ARM, przynajmniej z oryginalnym iPhonem - nigdy nie zajmował się innymi), będąc w rzeczywistości dużym endianem. Niestety, możesz nie rób tego na poziomie procesu, IIRC, tak jak możesz to zrobić za pomocą PowerPC (potężny dodatek do emulatorów). ” news.ycombinator.com/item?id=1527676
0x6A75616E

Odpowiedzi:

6

nawet jeśli uważasz, że nie musisz znać endianizmu, który ktoś może zrobić. Nie musisz wyjaśniać, dlaczego ktoś tego nie potrzebuje, ponieważ możesz nie znać kontekstu. Pytanie nie brzmi „czy muszę znać endianizm”, ale raczej „czy to duży czy mały endian”. Proszę więc skoncentrować się na temacie!

Powiedziawszy, że to prawdopodobnie najlepsza praktyka, jeśli nie wynajdujemy koła na nowo i polegamy tylko na makrach, które Apple to zapewnia. Powodem jest to, że spędzili sporo czasu na optymalizacji tych makr i upewnili się, że działa dobrze z symulatorem, a także na Macu, iPhonie i całym ich systemie operacyjnym i sprzęcie.

Jeśli odkryjesz, co się dzieje podczas wywoływania CFSwapInt16BigToHost, możesz zobaczyć komentarze sugerujące, że te makra produkują prawdopodobnie najlepszy kod maszynowy, jaki można uzyskać za pomocą optymalizacji kompilatora:

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;
}
trudnai
źródło
3

Endianness nie jest czymś, z czym użytkownicy końcowi mają jakąkolwiek rzeczywistą interakcję - ale oto podsumowanie 10 000 stóp, co to oznacza dla użytkowników produktów Apple.

W skrócie - endianowość wewnętrznego procesora jest taka sama jak kierunek pisania dla języka. Kiedy patrzysz na litery tekstu w języku angielskim, wszyscy zgadzamy się zacząć od lewego górnego rogu i przeczytać najpierw prawo, a potem dół. Inne języki zaczynają się po prawej stronie i czytają w lewo, a niektóre nawet czytają najpierw przed przejściem w lewo lub w prawo .

Dla użytkownika tak naprawdę nie ma znaczenia, czy bity w wewnętrznej reprezentacji adresu lub liczby są przechowywane w małej lub dużej. W rzeczywistości OS X na Macu jest zgodny z reprezentacją big-endian, a iOS jest zgodny z porządkowaniem little-endian . Ten fakt w żaden sposób nie oznacza, że ​​oba urządzenia nie mogą ze sobą poprawnie współpracować. Działa to, ponieważ ta reprezentacja odbywa się tylko wewnętrznie i nie jest ujawniana nam jako użytkownikom.

bmike
źródło
10
OSX na PowerPC to Big Endian, na Intelu to Little Endian.
zaph