Endianness айфонов?

10

Я знаю, что айфоны (и айпады) работают на процессорах ARM, которые по умолчанию имеют порядок с прямым порядком байтов (и, согласно странице Википедии, iOS сама по себе имеет младший порядок); однако у процессоров ARM есть возможность переключения между порядками байтов и байтов. Насколько это возможно и как это работает?

Слартибартфаст
источник
1
Как ответ на этот вопрос будет полезен для решения проблемы или улучшения вашего опыта использования iPhone? Если он решает какую-то реальную проблему конечного пользователя, не являющегося разработчиком, то не имеет значения, насколько он технический, но если этот вопрос представляет интерес только для разработчиков, он здесь не по теме.
Даниил
Хорошо, тогда я должен переместить его в stackoverflow?
slartibartfast
2
@myrkos Или superuser.com
Дэн Джей
6
Давайте уточним вопрос в первую очередь. Мы ищем короткие вопросы, которые требуют длинного ответа. Это относится ко всем сайтам. SuperUser не место для вопросов iOS вообще. Мы лучшее место для аппаратных вопросов на iOS. Если у вас есть конкретная проблема в программировании, то вопрос об этом и объяснение того, как аппаратная поддержка iOS влияет на ваш конкретный вопрос о программировании, могли бы стать решением проблемы [так, в данном случае это не форум]. Если вы хотите, чтобы пользователь посмотрел на эту проблему, трудно представить какой-либо сайт лучше для размещения этого вопроса, чем здесь.
bmike
2
«ARM - это 32-разрядная RISC-архитектура с прямым порядком байтов, широко используемая мобильными устройствами. Здесь следует сделать небольшое замечание: ARM - это двоичный (байтосексуальный, если хотите); вы можете переключать порядковый номер с самого низкого уровня. Просто так получается, что iOS использует его как little-endian. Кажется, я помню, что чип baseband (который также является ядром ARM, по крайней мере, с оригинальным iPhone - никогда не имел дело с другими) на самом деле является прямым порядком байтов. К сожалению, вы можете не делайте этого на уровне отдельных процессов, IIRC, как вы можете с PowerPC (привилегия huuuuge для эмуляторов). " news.ycombinator.com/item?id=1527676
0x6A75616E

Ответы:

6

даже если вы думаете, что вам не нужно знать порядок байтов, который кто-то может сделать. Не нужно объяснять, почему кому-то это не нужно, потому что вы можете не знать контекст. Вопрос не в том, «нужно ли мне знать порядок байтов», а в том, «это порядок байтов». Поэтому сконцентрируйтесь на теме, пожалуйста!

Сказав, что, вероятно, это лучшая практика, если мы не изобретаем колесо и просто полагаемся на макросы, которые Apple предоставляет для этого. Причина в том, что они потратили довольно много времени на оптимизацию этих макросов и убедились, что они хорошо работают с симулятором, а также с Mac, iPhone и всеми их операционными и аппаратными средствами.

Если вы поймете, что происходит при вызове, CFSwapInt16BigToHostвы можете увидеть комментарии, которые предполагают, что эти макросы производят, вероятно, лучший машинный код, который вы можете получить с помощью оптимизации компилятора:

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
источник
3

Endianness - это не то, с чем конечные пользователи реально взаимодействуют, но вот краткое описание того, что это означает для пользователей продуктов Apple.

В двух словах - порядковый номер для внутреннего процессора совпадает с направлением письма для языка. Когда вы смотрите на буквы английского текста, мы все согласны начать с левого верхнего угла и читать сначала справа, а затем вниз. Другие языки начинаются справа и читаются слева, а некоторые даже читают сначала, прежде чем двигаться влево или вправо .

Для пользователя не имеет большого значения, хранятся ли биты во внутреннем представлении адреса или числа с прямым или прямым порядком байтов. Фактически OS X на Mac придерживается представления с прямым порядком байтов, а iOS придерживается порядка с прямым порядком байтов . Этот факт никоим образом не означает, что два устройства не могут работать вместе должным образом. Это работает, потому что это представление происходит только изнутри и не раскрывается нам как пользователям.

bmike
источник
10
OSX на PowerPC - это Big Endian, на Intel - Little Endian.
Zaph