Endianness

(подреждане на байтове)е редът, в който байтовете са подредени в машинна дума. За различни процесори може да се използва един от двата типа номериране на байтове в машинна дума: най-малко значимият (най-малкият) байт е или първият (най-ляво, най-ляво), или последният (най-дясно, най-дясно) в думата. Редът на байтовете се наричаbig-endian,ако първо се съхранява най-значимият (най-значимият) байт, последван от байтове в низходящ ред на значимост. Редът на байтовете се наричаlittle-endian,ако най-малкият (най-малкият) байт се съхранява първи, последван от байтове във възходящ ред на значимост.

Дори не се опитвайте да правите каквито и да било предположения относно endianness, когато пишете код на ядрото (освен ако кодът не е предназначен за определена хардуерна платформа, разбира се). Операционната система Linux поддържа хардуерни платформи и с двата реда на байтовете, включително тези машини, на които използваният ред на байтовете може да бъде конфигуриран по време на зареждане на системата и общият код трябва да е съвместим с който и да е ред на байтове.

На фиг. 19.1 показва пример за малък endianness, а фиг. 19.2 - малък байт.

Хардуерната платформа i386 използва ред на байтовете от малък ред. Повечето други хардуерни платформи обикновено използват обратния ред (big-endian).

Фиг. 19.1.Биг-ендиан ендиан

Фиг.19.2. Прав(малък край) ред на байтовете

Нека да разгледаме какво означават на практика тези типове кодиране и как изглежда двоичното представяне на 1027, когато се съхранява като четирибайтов целочислен тип данни.

00000000 00000000 00000100 00000011

Вътрешните представяния на това число в паметта, когато се използва малък ред и малък ред са различни, както е показано в таблица. 19.3.

Таблица 19.3.Местоположение на данните в паметта за различни редове на байтове

И накрая, друг пример е кодов фрагмент, който ви позволява да определите реда на байтовете за хардуерната платформа, на която работи.

Този пример работи както в ядрото, така и в потребителското пространство.

История на термините big-endian и little-endian

Термините big-endian и little-endian са заимствани от сатиричния роман на Джонатан Суифт „Пътешествията на Гъливер“, който е публикуван през 1726 г. В този роман най-важният политически проблем на лилипутския народ беше проблемът кой край на яйцето трябва да се счупи: от тъп (голям) или остър (малко). Тези, които предпочитаха тъп край, бяха наречени „тъпи краища“ (big-endian), докато тези, които предпочитаха остър край, бяха наречени „заострени“ (little-endian).

Аналогията между лилипутския дебат и дебата за това кой endian е по-добър предполага, че това е по-скоро политически въпрос, отколкото технически.

Ред на байтовете в ядрото

За всяка хардуерна платформа, поддържана от ядрото на Linux, една от двете константи BIG_ENDIAN или

LITTLE_ENDIAN, според използвания ред на байтовете.

Този заглавен файл включва също макроси от директорията include / linux/byteorder/, които помагат за преобразуването на един ред на байтове в друг. Най-често използваните макроси са показани по-долу.

u23 cpu_to_be32(u32); /* преобразуване на реда на байтовете на текущия процесор към голям ред */

u32 cpu_to_le32(u32); /* конвертиранеред на байтовете на текущия процесор към little-endian */

u32 be32_to_cpu(u32); /* преобразуване на реда на байтовете от голям ред към

ред на байтовете на текущия процесор */

u32 le32_to_cpus(u32); /* преобразуване на реда на байтовете от малкия край към текущия ред на байтовете на процесора */

Тези макроси преобразуват един ред на байтове в друг. В случай, че краят, между който се извършва преобразуването, е един и същ (например, ако преобразуването се извършва в обратен ред на байтовете и процесорът също използва същия край), тогава тези макроси не правят нищо. В противен случай се връща преобразуваната стойност.

Никога не трябва да се обвързвате с някаква конкретна честота на генериране на прекъсване на системния таймер и следователно колко пъти в секунда се променя променливата jiffies. Винаги е необходимо да се използва константата HZ, за да се определят правилно времевите интервали. Това е много важно, тъй като стойността на честотата на системния таймер може да се различава не само за различните хардуерни платформи, но и за една и съща хардуерна платформа, когато се използват различни версии на ядрото.

Например константата HZ за хардуерната платформа x86 вече е 1000. Това означава, че прекъсването на таймера се случва 1000 пъти в секунда или на всяка милисекунда. Въпреки това, преди серията ядро ​​2.6, за хардуерната платформа x86 стойността на константата HZ беше 100. За различните хардуерни платформи тези стойности са различни: за алфа хардуерната платформа константата HZ е 1024, а за платформата ARM е 100.

Никога не трябва да сравнявате стойността на променлива jiffie с число като

1000 и мисля, че винаги ще означава едно и също нещо. За да получите времеви интервали, винаги трябва да умножите или разделите на константата HZ, както вследващ пример.

HZ /* една секунда */ (2*HZ) /* две секунди */ (HZ/2) /* половин секунда */ (HZ/100) /* 10 ms */ (2*H2/100) /* 20 ms */

Източник: Любов, Робърт. Разработка на ядрото на Linux, 2-ро издание. : пер. от английски. - М .: LLC "I.D. Уилям” 2006. – 448 с. : аз ще. — Паралелно. синигер. английски