Порядок байтов и обращение

Предмет порядка байтов или порядок байтов, редко полностью объясняется в контексте сред смешанного порядка байтов. Эта глава объясняет различные проблемы, вовлеченные в порядок байтов, поскольку это касается PCI на основанных на PowerPC и основанных на Intel аппаратных средствах Macintosh.

Что такое Порядок байтов?

В Путешествиях Гулливера Джонатана Свифта Лилипуты были разделены на две фракции по вопросу который конец яйца раскрыть при потреблении его. Обратные порядки байтов повредили свое яйцо на большом конце, в то время как Прямые порядки байтов повредили его на маленьком конце. Почти таким же способом компьютерные разработчики находятся в постоянном состоянии разногласия относительно который конец многобайтового значения использовать сначала.

Для простоты порядок байтов в 32-разрядных числах часто представляется буквами ABCD, где буквы используются для описания порядка, в котором большинство, второе к большинству, второму к наименьшему количеству и младшим значащим байтам, сохранено в памяти.

Прямой порядок байтов относится к хранению небольшого конца многобайтового значения в самом низком адресе. Номер 513 в 32-разрядном значении, например, сохранен как 0x01020000 (DCBA), с 02 представление 512, и 01 представление другого 1. Указатель адреса для запуска значения указывает на 01.

Обратный порядок байтов относится к хранению головки шатуна многобайтового значения сначала. Это - порядок, в котором Вы, вероятно, приучены к наблюдению чисел, представленных в печати. Номер 513 представлен как 0x00000201 (ABCD) и указатель адреса для запуска этого значения указывают на крайнее левое 00.

Чтобы быть педантичным, существуют фактически n! байт упорядочивает, где n является числом байтов, одним словом, на данной архитектуре, и таким образом может быть произвольно много заказов байта, если Вы рассматриваете бесконечно размеры длинного слова.

Несколько тайных систем один раз представляли 513 как 0x00000102 (BADC). Это эквивалентно хранению 32-разрядного слова как два 16-разрядных слова с прямым порядком байтов. В теории упорядочивание CDAB также было бы возможно, как будет двадцать других возможных заказов байта. К счастью, тем не менее, маловероятно, что Вы будете когда-либо встречаться с системой, порядок байтов которой - что-либо кроме ABCD (обратный порядок байтов) или DCBA (прямой порядок байтов).

На платформе Macintosh основанные на PowerPC компьютеры Macintosh используют обращение с обратным порядком байтов, в то время как основанный на Intel Macs используют обращение с прямым порядком байтов.

Инвариантное байтом обращение по сравнению с порядком структуры данных

Шины PCI, проектом, прямым порядком байтов. Большинство не Intel базировался, компьютеры являются обратным порядком байтов. Это представляет много проблем для аппаратных разработчиков и программистов подобно. Эти проблемы главным образом имеют дело с порчей данных между шиной PCI и остальной частью системы.

Существует два фундаментальных пути, в которые данные должны быть преобразованы при контакте с устройствами PCI: изменение порядка байтов самих данных и сохранения инвариантного байтом упорядочивания. Они - два отдельных вопроса и не должны быть перепутаны.

Инвариантное байтом обращение является свойством самого моста шины. То, что означает инвариантное байтом обращение, - то, что при доступе к байту адресного пространства устройства PCI байтом Вы получаете данные в порядке, в котором это сохранено в памяти устройства.

С точки зрения разработчика программного обеспечения это означает, что аппаратные средства не делают подкачки байта данные. Однако от аппаратных средств авторская перспектива, аппаратные средства должны байт подкачивать все данные. Это различие в перспективе объяснено в Естественном Обращении Инварианта Байта Порядка байтов и Сохранения.

Порядок структуры данных, однако, относится к порядку, в котором байты многобайтового числа сохранены в памяти карты. Если порядок структуры данных отличается, чем порядок байтов хост-машины, дополнительный свопинг байта должен быть сделан в программном обеспечении. Это описано в Порядке Структуры данных.

Естественное обращение инварианта байта порядка байтов и сохранения

С аппаратной точки зрения все данные по шине PCI являются прямым порядком байтов. Однако на аппаратных средствах PowerPC, основная шина CPU является обратным порядком байтов. Физическое упорядочивание байтов на этих двух шинах фактически противоположно. Если бы данные были считаны из шины PCI с помощью процессора с обратным порядком байтов без какого-либо манипулирования, то байты были бы инвертированы в 32-разрядных блоках (или 64-разрядных блоках для 64-разрядных транзакций PCI).

Эффект такого переупорядочения состоял бы в том, что нуль адреса будет соответствовать адресу три на противоположной стороне моста, адресоваться, можно было бы соответствовать адресу два и т.д. Это ясно не желательно.

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

Таким образом, если Вы пишете драйвер для микросхемы моста узла на основанных на PowerPC компьютерах или другой архитектуре с обратным порядком байтов, Вы, вероятно, хотите включить автоматический свопинг байта для обеспечения инвариантного байтом обращения. Однако, если Вы пишете драйвер для микросхемы моста узла на Intel или другой архитектуре с прямым порядком байтов, Вы, вероятно, не хотите делать этот свопинг.

Необходимо отметить, однако, что с точки зрения драйвера устройства, байт 0 является все еще байтом 0, и байт 1 является все еще байтом 1. Таким образом Вы не должны именовать этот процесс как свопинг байта. Этот процесс свопинга более точно вызывают, сохраняя обращение инварианта байта или сохранение естественного порядка байтов.

Порядок структуры данных

Порядок структуры данных - то, о чем думает большинство разработчиков, когда они слышат фразу “подкачка байта”. Устройства PCI могут разметить свои регистры всегда, что разработчик карты считает целесообразным. В большинстве случаев карта регистра для карты содержит некоторую комбинацию 1 байта, 2 байтов, и часто 4-байтовые регистры. Каждый из этих регистров может быть с обратным порядком байтов или с прямым порядком байтов. Для большинства устройств регистры являются прямым порядком байтов, но это не гарантируется.

При доступе к регистру устройства обычно необходимо знать адрес регистра (обычно как смещение от запуска пространства памяти карты), порядок байтов регистра и размер регистра. Для единственных адресов байта необходимо знать только адрес и размер, так как порядок байтов только влияет на многобайтовые значения.

Основные правила являются прямыми:

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

Конечно, ручной свопинг байта утомителен в лучшем случае подвержен ошибкам в худшем случае и обычно неприятен в целом. Поэтому несколько функций и методов существуют в OS X для упрощения чтения и записи регистров различных размеров и в мало и в режимы с обратным порядком байтов.

Для операций на пространстве конфигурации PCI платформа PCI обеспечивает методы такой как configRead16 и configWrite16.

libkern функции доступа байта, такой как OSReadLittleInt16 и OSWriteLittleInt16, обеспечьте универсальный свопинг байта для данных на основе размера и порядка байтов регистра, считанного или записанного. Подобные функции, такой как OSReadBigInt16 и OSWriteBigInt16, доступны для регистров устройства с обратным порядком байтов, в редком случае, что Вы могли бы столкнуться с таким регистром.

Эти функции, найденные в libkern/OSByteOrder.h выполните свопинг байта, если упорядочивание памяти хоста не является тем же как порядком байтов регистра. Необходимо всегда писать драйверы с помощью них независимые от платформы макросы и функции вместо того, чтобы использовать явные функции подкачки как OSWriteSwap16 непосредственно.

Для получения дополнительной информации посмотрите заголовочный файл для этих функций, /System/Library/Frameworks/Kernel.framework/Headers/libkern/OSByteOrder.h, и любой пример драйверы PCI.

Работа с адресами

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

При доступе к адресам на шине PCI из программного обеспечения адреса переводятся по мере необходимости в мосте, так же, как любые другие данные; таким образом байты адреса сохранены тем же инвариантным байтом способом в регистрах устройства, как они появляются на стороне CPU моста. Однако, когда адреса переданы к устройству PCI, воздействующему на те адреса, необходимо заботиться.

В то время как адреса (по крайней мере, на PowerPC и другой архитектуре с обратным порядком байтов) сохранены в порядке с обратным порядком байтов, Обычно регистры на устройствах PCI находятся в порядке с прямым порядком байтов. Таким образом они должны быть подкачанным байтом. Точно так же, как любые другие данные, тем не менее, если устройство PCI использует упорядочивание обратного порядка байтов для того регистра, Вы не должны подкачка байта. Реверс применяется на Intel и другую архитектуру с прямым порядком байтов.

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