Endianness di iPhone?


10

So che iPhone (e iPad) funzionano con processori ARM, che per impostazione predefinita sono little-endian (e iOS su se stesso è little-endian secondo la pagina di Wikipedia); tuttavia, i processori ARM presumibilmente hanno la possibilità di passare da little-endian a big-endian. Quanto è possibile e come funziona?


1
In che modo la risposta a questa domanda sarebbe utile per risolvere un problema o migliorare la tua esperienza di utilizzo di un iPhone? Se affronta alcune preoccupazioni del mondo reale di un utente finale non sviluppatore, non importa quanto sia tecnico, ma se la domanda è solo di interesse per gli sviluppatori, qui è fuori tema.
Daniel

Ok, allora dovrei spostarlo su StackOverflow?
slartibartfast,

2
@myrkos O superuser.com
Dan J,

6
Affiliamo prima la domanda. Siamo alla ricerca di brevi domande che invitano a una risposta lunga. Questo vale per tutti i siti. SuperUser non è il posto adatto a domande iOS di alcun tipo in generale. Siamo il posto migliore per domande sull'hardware su iOS. Se hai un problema di programmazione specifico, allora fare quella domanda e spiegare come l'endianness hardware iOS sta influenzando la tua specifica domanda di programmazione sarebbe la strada da percorrere [SO e non qui è il forum in quel caso]. Se desideri una prospettiva utente su questo problema, è difficile vedere qualsiasi sito come un posto migliore per ospitare quella domanda rispetto a qui.
bmike

2
"ARM è un'architettura RISC little-endian a 32 bit ampiamente utilizzata dai dispositivi mobili. Devo fare una piccola nota qui: ARM è bi-endian (se necessario); puoi attivare l'endianità dal livello più basso. succede solo che iOS lo usa come un piccolo endian. Mi sembra di ricordare che il chip in banda base (che è anche un core ARM, almeno con l'iPhone originale - mai trattato con gli altri) essendo un big endian, in effetti. Purtroppo, puoi farlo a livello di processo, IIRC, come è possibile con PowerPC (un vantaggio enorme per gli emulatori). " news.ycombinator.com/item?id=1527676
0x6A75616E

Risposte:


6

anche se pensi di non aver bisogno di conoscere l'endianità che qualcuno potrebbe fare. Non c'è bisogno di spiegare perché qualcuno non ne abbia bisogno perché potresti non conoscere il contesto. La domanda non è "devo conoscere l'endianità" ma piuttosto "è un endian grande o piccolo". Quindi concentrati sull'argomento per favore!

Detto questo, probabilmente è la migliore pratica se non reinventiamo la ruota e facciamo affidamento solo sulle macro fornite da Apple. Il motivo è perché hanno trascorso un bel po 'di tempo per ottimizzare queste macro e si sono assicurati che funzionasse bene con il simulatore, nonché su Mac, iPhone e tutti i loro sistemi operativi e hardware.

Se CFSwapInt16BigToHostriesci a capire cosa sta succedendo quando invochi puoi vedere dei commenti che suggeriscono che queste macro stanno probabilmente producendo il miglior codice macchina che puoi ottenere con l'aiuto dell'ottimizzazione del compilatore:

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

L'endianness non è qualcosa con cui gli utenti finali abbiano una reale interazione, ma ecco un riepilogo di 10.000 piedi di ciò che ciò significa per gli utenti dei prodotti Apple.

In breve, l'endianness per un processore interno è la stessa direzione di scrittura di una lingua. Quando guardi le lettere di un testo inglese, siamo tutti d'accordo di iniziare in alto a sinistra e leggere prima a destra e poi in basso. Altre lingue iniziano a destra e leggono a sinistra e alcune addirittura leggono prima di spostarsi a sinistra o a destra .

Non importa a un utente se i bit in una rappresentazione interna di un indirizzo o di un numero vengono memorizzati little endian o big endian. In effetti OS X su Mac aderisce a una rappresentazione big-endian e iOS aderisce all'ordinamento little-endian . Questo fatto non significa in alcun modo che i due dispositivi non possano funzionare insieme correttamente. Questo funziona perché questa rappresentazione avviene solo internamente e non viene esposta a noi come utenti.


10
OSX su PowerPC è Big Endian, su Intel è Little Endian.
zaph,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.