Endianness de iPhones?

10

Sé que los iPhones (y iPads) se ejecutan en procesadores ARM, que son little-endian por defecto (y iOS en sí mismo es little-endian según la página de Wikipedia); sin embargo, los procesadores ARM supuestamente tienen la capacidad de cambiar entre little-endian y big-endian. ¿Qué tan posible es esto y cómo funciona?

slartibartfast
fuente
1
¿Cómo sería útil la respuesta a esta pregunta para resolver un problema o mejorar su experiencia al usar un iPhone? Si aborda alguna inquietud del mundo real de un usuario final que no es desarrollador, no importa cuán técnico sea, pero si la pregunta solo es de interés para los desarrolladores, aquí no está de acuerdo.
Daniel
Ok, ¿debería moverlo a stackoverflow?
slartibartfast
2
@myrkos O superuser.com
Dan J
66
Agudicemos la pregunta primero. Estamos buscando preguntas cortas que inviten a una respuesta larga. Esto aplica para todos los sitios. SuperUser no es el lugar para preguntas de iOS de ningún tipo en general. Somos el mejor lugar para preguntas sobre hardware en iOS. Si tiene un problema de programación específico, entonces hacer esa pregunta y explicar cómo la resistencia del hardware de iOS está afectando su pregunta de programación específica sería el camino a seguir [SO y no aquí es el foro en ese caso]. Si desea una perspectiva del usuario sobre este tema, es difícil ver que un sitio sea un mejor lugar para albergar esa pregunta que aquí.
bmike
2
"ARM es una arquitectura RISC de 32 bits little endian ampliamente utilizada por los dispositivos móviles. Tengo que hacer una pequeña nota aquí: ARM es bi endian (bytesexual, si quieres); puedes alternar el endianness desde el nivel más bajo. Simplemente sucede que iOS lo usa como little endian Parece que recuerdo que el chip de banda base (que también es un núcleo ARM, al menos con el iPhone original, nunca se ocupó de los demás) es big endian, de hecho. Lamentablemente, puedes No haga esto en un nivel por proceso, IIRC, como puede hacerlo con PowerPC (un beneficio enorme para los emuladores) ". news.ycombinator.com/item?id=1527676
0x6A75616E

Respuestas:

6

incluso si crees que no necesitas saber la resistencia que alguien podría tener. No es necesario explicar por qué alguien no lo necesita porque es posible que usted no conozca el contexto. La pregunta no es "¿necesito saber endianness" sino "es endian grande o pequeño". ¡Así que concéntrate en el tema por favor!

Habiendo dicho eso, probablemente sea la mejor práctica si no reinventamos la rueda y solo confiamos en las macros que Apple proporciona para esto. La razón es porque han dedicado bastante tiempo a optimizar estas macros y se han asegurado de que funcione bien con el simulador, así como en Mac, iPhone y todos sus sistemas operativos y hardware.

Si profundiza en lo que sucede cuando invoca CFSwapInt16BigToHost, puede ver comentarios que sugieren que estas macros están produciendo probablemente el mejor código de máquina que puede obtener con la ayuda de la optimización del 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
fuente
3

Endianness no es algo con lo que los usuarios finales tengan una interacción real, pero aquí hay un resumen de 10,000 pies de lo que esto significa para los usuarios de productos Apple.

En pocas palabras, la resistencia para un procesador interno es lo mismo que la dirección de escritura de un idioma. Cuando miras las letras de un texto en inglés, todos estamos de acuerdo en comenzar en la parte superior izquierda y leer primero a la derecha y luego hacia abajo. Otros idiomas comienzan a la derecha y se leen a la izquierda y algunos incluso leen primero antes de moverse hacia la izquierda o hacia la derecha .

Realmente no le importa a un usuario si los bits en una representación interna de una dirección o número se almacenan little endian o big endian. De hecho, OS X en una Mac se adhiere a una representación big-endian e iOS se adhiere a los pedidos little-endian . Este hecho no significa de ninguna manera que los dos dispositivos no puedan funcionar juntos correctamente. Esto funciona porque esta representación solo ocurre internamente y no se expone a nosotros como usuarios.

bmike
fuente
10
OSX en PowerPC es Big Endian, en Intel es Little Endian.
zaph