Endianness von iPhones?


10

Ich weiß, dass iPhones (und iPads) auf ARM-Prozessoren ausgeführt werden, die standardmäßig Little-Endian sind (und iOS an sich ist laut Wikipedia-Seite Little-Endian). ARM-Prozessoren sollen jedoch zwischen Little-Endian und Big-Endian wechseln können. Wie ist das möglich und wie funktioniert es?


1
Wie wäre die Antwort auf diese Frage hilfreich, um ein Problem zu lösen oder Ihre Erfahrung mit einem iPhone zu verbessern? Wenn es sich um ein reales Problem eines Nichtbenutzer-Endbenutzers handelt, spielt es keine Rolle, wie technisch es ist, aber wenn die Frage nur für Entwickler von Interesse ist, ist sie hier nicht zum Thema.
Daniel

Ok, sollte ich es dann in den Stackoverflow verschieben?
Slartibartfast

2
@myrkos Oder superuser.com
Dan J

6
Lassen Sie uns zuerst die Frage schärfen. Wir suchen kurze Fragen, die zu einer langen Antwort einladen. Dies gilt für alle Websites. SuperUser ist im Allgemeinen nicht der richtige Ort für iOS-Fragen. Wir sind der beste Ort für Hardware-Fragen unter iOS. Wenn Sie ein bestimmtes Programmierproblem haben, ist es der richtige Weg, diese Frage zu stellen und zu erklären, wie sich die Endianness der iOS-Hardware auf Ihre spezifische Programmierfrage auswirkt [SO und in diesem Fall nicht das Forum]. Wenn Sie eine Benutzerperspektive zu diesem Thema wünschen, ist es schwer zu erkennen, dass eine Website ein besserer Ort ist, um diese Frage zu beantworten als hier.
bmike

2
"ARM ist eine Little-Endian-32-Bit-RISC-Architektur, die von Mobilgeräten häufig verwendet wird. Hier muss ich eine kleine Anmerkung machen: ARM ist Bi-Endian (bytesexuell, wenn Sie so wollen); Sie können die Endianness von der untersten Ebene umschalten Es kommt einfach vor, dass iOS es als Little Endian verwendet. Ich erinnere mich an den Basisband-Chip (der auch ein ARM-Kern ist, zumindest mit dem ursprünglichen iPhone - nie mit den anderen befasst), der tatsächlich Big Endian ist. Leider können Sie das Tun Sie dies nicht auf Prozessebene, IIRC, wie Sie es mit PowerPC können (ein riesiger Vorteil für Emulatoren). " news.ycombinator.com/item?id=1527676
0x6A75616E

Antworten:


6

selbst wenn Sie denken, dass Sie nicht wissen müssen, was jemand tun könnte. Sie müssen nicht erklären, warum jemand es nicht benötigt, da Sie den Kontext möglicherweise nicht kennen. Die Frage ist nicht "Muss ich Endianness kennen", sondern "Ist es Big- oder Little Endian"? Konzentrieren Sie sich also bitte auf das Thema!

Allerdings ist es wahrscheinlich die beste Vorgehensweise, wenn wir das Rad nicht neu erfinden und uns nur auf die Makros verlassen, die Apple dafür bereitstellt. Der Grund dafür ist, dass sie einige Zeit damit verbracht haben, diese Makros zu optimieren, und dafür gesorgt haben, dass sie sowohl mit dem Simulator als auch mit Mac, iPhone und all ihren Betriebssystemen und ihrer Hardware gut funktionieren.

Wenn Sie herausfinden, was beim Aufrufen passiert, werden CFSwapInt16BigToHostmöglicherweise Kommentare angezeigt, die darauf hindeuten, dass diese Makros wahrscheinlich den besten Maschinencode erzeugen, den Sie mithilfe der Compileroptimierung erhalten können:

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;
}

3

Endianness ist nichts, mit dem Endbenutzer wirklich interagieren - aber hier ist eine 10.000-Fuß-Zusammenfassung dessen, was dies für Benutzer von Apple-Produkten bedeutet.

Kurz gesagt - Endianness für einen internen Prozessor entspricht der Schreibrichtung für eine Sprache. Wenn Sie sich Buchstaben eines englischen Textes ansehen, stimmen wir alle zu, oben links zu beginnen und zuerst rechts und dann unten zu lesen. Andere Sprachen beginnen rechts und lesen links und einige lesen sogar zuerst nach unten, bevor sie sich nach links oder rechts bewegen .

Für einen Benutzer ist es nicht wirklich wichtig, ob die Bits in einer internen Darstellung einer Adresse oder Nummer als Little Endian oder Big Endian gespeichert werden. Tatsächlich hält sich OS X auf einem Mac an eine Big-Endian-Darstellung und iOS an die Little-Endian-Reihenfolge . Diese Tatsache bedeutet keineswegs, dass die beiden Geräte nicht richtig zusammenarbeiten können. Dies funktioniert, weil diese Darstellung nur intern erfolgt und uns als Benutzer nicht ausgesetzt wird.


10
OSX auf PowerPC ist Big Endian, auf Intel ist es Little Endian.
Zaph
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.