Порядок проходження байтів

(byte ordering) – Це порядок, згідно з яким байти розташовані в машинному слові Для різних процесорів може використовуватися один з двох типів нумерації байтів в машинному слові: найменш значимий (наймолодший) байт є або найпершим (найбільш лівим, left-most), або самим останнім (найбільш правим, right-most) в слові Порядок байтів називається зворотним (big-endian), якщо найбільш значимий (найстарший) байт зберігається першим, а за ним йдуть байти в порядку убування значущості Порядок байтів називається прямим (little-endian), якщо найменш значимий (наймолодший) байт зберігається першим, а за ним слідують байти в порядку зростання значущості

Навіть не намагайтеся грунтуватися на будь-яких припущеннях про порядок проходження байтів при написанні коду ядра (звичайно, якщо код не призначений для будь-якої конкретної апаратної платформи) Операційна система Linux підтримує апаратні платформи з обома порядками байтів, включаючи і ті машини, на яких використовуваний порядок байтів можна конфігурувати на етапі завантаження системи, а загальний код повинен бути сумісний з будь-яким порядком байтів

На рис 191 показаний приклад зворотного порядку проходження байтів, а на рис 192 – прямого порядку проходження байтів

Апаратна платформа i386 використовує прямий (little-endian) порядок байтів Більшість інших апаратних платформ зазвичай використовує зворотний (big-endian) порядок

5 Якби компілятор мав можливість змінять ь порядо до прямування нулі й структури даних, то будь-який існуючий код, який ї вже використовує цю структуру, міг би зіпсувати дані У мові програмування С функції обчислюють положення полів простий про шляхом введення зміщень від початкової адреси структури в памяті

Номер байта

0     1    2    3

Старший байт

Молодший байт

Рис 191Зворотній (big-endian) порядок проходження байтів

Номер байта

3 2 1 Про

Старший байт

Молодший байт

Рис192 Прямей(Little-endian) порядок проходження байтів

Розглянемо, що ці типи кодування позначають на практиці і як виглядає двійкове подання числа 1027, яке зберігається у вигляді чотирьохбайтового целочисленного типу даних

00000000 00000000 00000100 00000011

Внутрішні подання цього числа в памяті при використанні прямого і зворотного порядку байтів відрізняються, як це показано в табл 193

Таблиця 193 Розташування даних в памяті для різних порядків проходження байтів

Адреса

Зворотний порядок

Прямий порядок

0

00000000

00000011

1

00000000

00000100

2

00000100

00000000

3

00000011

00000000

Зверніть увагу на те, що для апаратної платформи із зворотним порядком байтів найстарший байт записується в самий мінімальний адресу памяті

І нарешті, ще один приклад – фрагмент коду, який дозволяє визначити порядок байтів для тієї апаратної платформи, на якій він виконується

int х = 1

if (* (char *) & х == 1)

/ * Прямий порядок * /

else

/ * Зворотний порядок * /

Цей приклад працює як в ядрі, так і в просторі користувача

Історія термінів big-endian і little-endian

Термін и big-endian і little-endian запозичений и з сатіріческог про роман а Джонатана Свіфта Подорож Гулівера, який був виданий в 1726 році У цьому романс найбільш важливою політичною проблемою народу ліліпутів була проблема, з якого кінця слід розбивати яйце: з тупого (big) або гострого (little) Тих, хто віддавав перевагу тупий кінець називали тупоконечниками (Big-endian), тих же, хто віддавав перевагу гострий кінець, називали гостроконечниками (Little-endian)

Аналогія між дебатами ліліпутів і суперечками про те, який порядок байтів краще, говорить про те, що це питання більше політичне, ніж технічний

Порядок байтів в ядрі

Для кожної апаратної платформи, яка підтримується ядром Linux, у файлі визначена одна з двох констант    BIG_ENDIAN або

    LITTLE_ENDIAN, відповідно до використовуваним порядком байтів

У цей заголовний файл також включаються макроси з каталогу include / linux / byteorder /, які допомагають конвертувати один порядок байтів в інший Нижче показані найбільш часто використовувані макроси

u23  cpu_to_be32 (u32) / * Перетворити порядок байтів поточного процесора в порядок big-endian * /

u32  cpu_to_le32 (u32) / * Перетворити порядок байтів поточного процесора в порядок little-endian * /

u32  be32_to_cpu (u32) / * Перетворити порядок байтів big-endian в

порядок байтів поточного процесора * /

u32  lе32_to_cpus (u32) / * Перетворити порядок байтів little-endian в порядок байтів поточного процесора * /

Ці макроси виконують перетворення одного порядку байтів в інший У разі коли порядки байтів, між якими виконується перетворення, однакові (наприклад, якщо виконується перетворення в зворотний порядок байтів і процесор теж використовує такий же порядок), то ці макроси не роблять нічого В іншому випадку повертається перетворене значення

Таймер

Ніколи не можна привязуватися до якоїсь конкретної частоті генерації переривання системного таймера і, відповідно, до того, скільки разів в секунду змінюється змінна jiffies Завжди необхідно використовувати константу HZ, щоб коректно визначати інтервали часу Це дуже важливо, тому що значення частоти системного таймера може відрізнятися не тільки для різних апаратних платформ, але і для однієї апаратної платформи при використанні різних версій ядра

Наприклад, константа HZ для апаратної платформи х86 зараз дорівнює 1000 Це означає, що переривання таймера виникає 1000 разів на секунду, або кожну мілісекунду Проте до серії ядер 26 для апаратної платформи х86 значення константи HZ дорівнювало 100 Для різних апаратних платформ ці значення відрізняються: для апаратної платформи alpha константа HZ дорівнює 1024, а для платформи  ARM — 100

Ніколи не можна порівнювати значення змінної jiffie s з числом, таким як

1000, і думати, що це завжди буде означати одне і те ж Для отримання інтервалів часу необхідно завжди множити або ділити на константу HZ, як у наступному прикладі

HZ / * одна секунда * / (2 * HZ) / * дві секунди * / (HZ / 2) / * півсекунди * / (HZ/100) / * 10 мс * / (2 * Н2/100) / * 20 мс * /

Константа HZ визначена п файлі Про це докладно розказано в главі 10, Таймери та упрадленіе часом.

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*