7
  1. Мне было интересно, зависит ли порядок байтов только от процессора?
  2. Зависит ли это от другого оборудования, такого как память, вторичное запоминающее устройство?
  3. Это зависит от ОС? Почему в Википедии это похоже на правду?

4 ответа4

13
  1. CPU управляет порядком байтов. Несколько процессоров могут переключаться между старшим и младшим порядком байтов. Архитектуры x86/amd64 не обладают этой функцией.

  2. Endianness - это неявная вещь с инструкциями загрузки и хранения на процессоре. Данные, которые не помещаются в один байт (0-255), должны читаться и записываться в виде последовательности из нескольких байтов, и, очевидно, эти байты должны читаться и записываться в согласованном порядке. Разработчики ЦП также должны выбрать порядок, из которого считываются и записываются байты регистров. Порядок не важен, если данные никогда не покидают ЦП или ОЗУ, но когда вы сталкиваетесь с такими вещами, как запись данных в регистры ввода / вывода (которые могут не ожидать того же порядка) и секторами диска (где другие системы могут читать данные ) тогда это становится важным, и нужен внешний стандарт. Этот стандарт обычно является частью спецификации оборудования или формата файла. Любой программист / проект, достойный его внимания, собирается разработать постоянные форматы, чтобы принять это во внимание, плохое программирование или программирование, которое предполагало, что вещи всегда будут читаться на одной архитектуре, может выявить ошибку.

  3. ОС имеет дело с регистрами ввода-вывода и секторами диска, поэтому здесь применяется № 2. Одна особенно важная область, которой нужен общий стандарт для всех процессоров, - это реализация файловых систем. Вот почему существуют отдельные сборки Debian mips и mipsel а что нет.

9

Порядковый номер относится к числовым данным, когда число слишком велико, чтобы поместиться в один байт. Например, текст ASCII - это просто байты подряд, не связанные с порядком байтов.

Если мы поместим небольшое число, например, 42, в 32-разрядное (4-байтовое) целое число, мы увидим, что для старшего байта (BE) используется только последний байт, а для младшего байта (LE) используется только первый байт:

|    | byte[0] | byte[1] | byte[2] | byte[3] |
|----+---------+---------+---------+---------|
| BE |       0 |       0 |       0 |      42 |
| LE |      42 |       0 |       0 |       0 |

Порядковый номер архитектуры - это порядковый номер процессора. RAM не делает математику, поэтому это не волнует.

Такие устройства, как звуковые карты, действительно заботятся (например, 16-битное 44100 кГц аудио - это в основном BE), но операционная система (драйвер устройства) отвечает за то, чтобы ЦПУ, возможно, преобразовал порядок байтов до отправки на звуковую карту.

В сетях, в основном, все с прямым порядком байтов, поэтому ОС должна указывать процессорам с прямым порядком байтов целочисленные переменные байтов при создании сетевых пакетов.

Файловые системы имеют обе последовательности. Например, FAT32 является LE, поэтому при использовании FAT32 только BE-архитектуры должны выполнять замену байтов.

При программировании на C вы должны помнить, что нужно использовать функции htonl() и ntohl() для преобразования между host- (native) и сетевым порядком байтов. Когда программа скомпилирована в системе с прямым порядком байтов, функции ничего не делают. В системах с прямым порядком байтов они меняют порядок байтов.


Endianness архитектуры - вещь байтового уровня. Порядок / нумерация битов, в основном, не имеет значения при рассмотрении порядка следования архитектуры. НО это всегда приятно знать :)

Примерно LSB (наименее значимый бит) - это первый битовый мир, а MSB (старший значащий бит) - это битовый мир.

Кажется, что большинство процессорных и последовательных шин являются (на удивление) LSB даже в системах с прямым порядком байтов, таких как SPARC. Также Ethernet является LSB, несмотря на то, что байты в основном идут в порядке с прямым порядком байтов. С другой стороны, например, PPC с прямым порядком байтов и MSB первым.

3

Endianness - это простой порядок, в котором процессор помещает биты двоичного числа. ОЗУ не заботится о том, в каком порядке данные сохраняются на нем, и не о жестком диске (поскольку они не выполняют никаких действий с содержимым потока данных, просто выполняют указания процессора / набора микросхем о том, где их разместить). Операционные системы могут быть созданы для работы с обоими порядками байтов (например, Mac OS X).

2

Порядковый номер не обязательно зависит от процессора. Например, Ethernet и большинство низкоуровневых протоколов TCP/IP являются порядком байтов, независимо от процессора, и, надеюсь, машины на базе x86 все еще могут подключаться к Интернету. Аналогично, операционные системы, работающие на процессоре с прямым порядком байтов, будут считывать FAT32 с файловой системой с прямым порядком байтов или использовать PCI-карты с прямым порядком байтов и так далее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .