Robert Love - dezvoltarea kernel-ului Linux - pagina 125

vulpe char; / * 1 octet * /

U8 __pad1; / * 1 octet * /

Rețineți că sizeof expresie (foo_struct) este egală cu valoarea de 12 pentru orice instanță a acestei structuri pentru majoritatea platformelor hardware pe 32 de biți. compilator C adauga automat elementele de umplere pentru a asigura alinierea necesară.

De multe ori este posibil să rearanja structura câmpului, astfel încât să se evite necesitatea de a umple. Acest lucru permite aliniat în mod corespunzător pentru a primi date fără a introduce elemente suplimentare și umple, respectiv, structura de dimensiuni mai mici.

struct struct animal

pisică unsigned long; / * 4 octeți * /

porc scurt unsigned; / * 2 octeți * /

câine char; / * 1 octet * /

vulpe char; / * 1 octet * /

Această structură de date are o dimensiune de 8 octeți. Cu toate acestea, nu există întotdeauna o posibilitate de relocare a structurii componentelor locurilor și determinarea modificărilor de structură. De exemplu, în cazul în care structura este livrat ca parte a standardului, sau este deja utilizat în codul existent, ordinea câmpuri nu pot fi schimbate. Uneori, pentru un motiv sau altul, poate fi necesar un ordin special de domeniul structurii, cum ar fi o aliniere specială de variabile pentru a optimiza lovit cache. Rețineți că, în conformitate cu standardul ANSI C, compilatorul ar trebui să nu se schimbe ordinea câmpurilor în structurile [95] date - că legea are doar un programator.

Dezvoltatorii kernel ar trebui să ia în considerare particularitățile de completare a schimbului de structuri de date: transferul structurilor într-o rețea sau de economisire directă pe disc, deoarece nevoia de a umple pot fi diferite pentru platforme hardware diferite. Acesta este unul dintre motivele pentru care în limbajul de programare C este nicio structură operator de comparare. Memoria care este utilizat pentru a popula structurile de date pot conține informații aleatoare, ceea ce face imposibilă octet prin compararea octet de structuri. Dezvoltatorii limbaj, de programare C pe bună dreptate, astfel, încât a lăsat nici o soluție la problema structurilor de comparație la latitudinea programator care poate crea funcțiile lor de comparație, în fiecare caz, pentru a utiliza caracteristicile de construcție a structurilor din beton.

comandă byte

Endianness (byte de comanda) - aceasta este ordinea în care octeți sunt situate în cuvântul mașinii. Pentru diferite procesoare pot fi folosite de la două tipuri de mașini de numerotare octet cuvânt: semnificativ (cel mai puțin semnificativ) octetul cel mai puțin este fie primul (cel mai din stânga, mai din stânga), sau cele mai recente (cea mai dreapta, dreapta-mai), în cuvântul. Ordinea octet se numește inversa (big-endian), în cazul în care cel mai semnificativ (cel mai semnificativ) octetul este stocat mai întâi, urmat de octeți sunt în ordinea importanței. Procedura se numește octeți direcți (little-endian), în cazul cel mai puțin semnificativ (cel mai puțin semnificativ) byte este stocat mai întâi, urmat de octeți în ordine crescătoare a importanței.

Nu încercați să se bazeze pe orice presupuneri despre ordinea octeților atunci când scrieți cod kernel (desigur, în cazul în care codul nu este destinat pentru orice platformă hardware specifice). Sistemul de operare Linux suportă platforme hardware cu ambele comanda octet, inclusiv cele care utilizează ordinea octet poate fi configurat în timpul pornirii sistemului, și codul general trebuie să fie compatibile cu orice ordine octet.

Fig. 19.1 prezintă un exemplu de ordine inversă a octeților și Fig. 19.2 - comanda directă octet.

Fig. 19.1. Reverse (big-endian) byte ordine

Robert Love - dezvoltarea kernel-ului Linux - pagina 125

Fig. 19.2. Direct (little-endian) octet comanda

i386 foloseste platforma hardware directă (little-endian) ordine octet. Cele mai multe alte platforme hardware utilizează de obicei ordine inversă (big-endian).

Luați în considerare faptul că aceste tipuri de codare notat în practică și se pare că reprezentarea binară a 1027 este stocată ca patru octeți de date de tip întreg.

00000000 00000000 00000100 00000011

Reprezentarea internă a numărului în memorie folosind înainte și invers endianness sunt diferite, așa cum se arată în tabelul. 19.3.

Tabelul 19.3. Locația de date în memorie pentru diferite endianness