Endianness de iPhones?

10

Eu sei que os iPhones (e iPads) são executados em processadores ARM, que são little-endian por padrão (e o iOS em si é little-endian, de acordo com a página da Wikipedia); no entanto, os processadores ARM supostamente têm a capacidade de alternar entre little-endian e big-endian. Quão possível é isso e como funciona?

slartibartfast
fonte
11
Como a resposta a esta pergunta seria útil para resolver um problema ou melhorar sua experiência no uso de um iPhone? Se ele abordar alguma preocupação do mundo real de um usuário final que não seja desenvolvedor, não importa o quão técnico ele seja, mas se a pergunta for apenas interessante para os desenvolvedores, será um tópico fora de tópico aqui.
Daniel
Ok, então devo movê-lo para stackoverflow?
Slartibartfast
2
@myrkos Or superuser.com
Dan J
6
Vamos afiar a pergunta primeiro. Estamos procurando perguntas curtas que convidem a uma resposta longa. Isso se aplica a todos os sites. O superusuário não é o lugar para perguntas sobre iOS de qualquer tipo em geral. Nós somos o melhor lugar para perguntas sobre hardware no iOS. Se você tiver um problema de programação específico, faça essa pergunta e explique como a persistência do hardware do iOS está afetando sua pergunta específica de programação. Se você deseja uma perspectiva do usuário sobre esse assunto, é difícil ver qualquer site como um local melhor para abrigar essa pergunta do que aqui.
Bmike
2
"O ARM é uma arquitetura RISC pouco endiana de 32 bits, amplamente usada por dispositivos móveis. É preciso fazer uma pequena anotação aqui: O ARM é bi-endiano (bytesexual, se você preferir); você pode alternar a endianness do nível mais baixo. Acontece que o iOS o usa como pouco endian.Lembro-me de que o chip de banda base (que também é um núcleo ARM, pelo menos com o iPhone original - nunca lidou com os outros) é big endian, na verdade. faça isso em um nível por processo, IIRC, como você pode com o PowerPC (uma vantagem de huuuuge para emuladores). " news.ycombinator.com/item?id=1527676
0x6A75616E

Respostas:

6

mesmo que você ache que não precisa conhecer a perseverança que alguém pode fazer. Não é necessário explicar por que alguém não precisa, porque você pode não conhecer o contexto. A questão não é "eu preciso conhecer endianness", mas "é endian grande ou pequeno"? Então concentre-se no assunto, por favor!

Dito isto, provavelmente é a melhor prática se não reinventarmos a roda e confiarmos nas macros que a Apple fornece para isso. O motivo é que eles gastaram bastante tempo para otimizar essas macros e certificaram-se de que funcionassem bem com o simulador, bem como no Mac, iPhone e em todos os SOs e hardwares.

Se você descobrir o que está acontecendo quando você chamar, CFSwapInt16BigToHostpoderá ver comentários que sugerem que essas macros estão produzindo provavelmente o melhor código de máquina que você pode obter com a ajuda da otimização do compilador:

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
fonte
3

Endianness não é algo com o qual os usuários finais tenham qualquer interação real - mas aqui está um resumo de 10.000 pés do que isso significa para usuários de produtos Apple.

Em poucas palavras, o endianness para um processador interno é o mesmo que a direção de escrita para um idioma. Quando você olha as letras de um texto em inglês, todos concordamos em começar no canto superior esquerdo e ler primeiro à direita e depois para baixo. Outros idiomas começam à direita e leem para a esquerda e alguns até leem primeiro antes de mover para a esquerda ou direita .

Realmente não importa para o usuário se os bits em uma representação interna de um endereço ou número são armazenados como little endian ou big endian. De fato, o OS X em um Mac adere a uma representação de big endian e o iOS adere a pedidos de little endian . Esse fato não significa que os dois dispositivos não possam funcionar juntos corretamente. Isso funciona porque essa representação acontece apenas internamente e não é exposta a nós como usuários.

bmike
fonte
10
OSX no PowerPC é Big Endian, na Intel é Little Endian.
Zaph 11/09/14