15 Nisan 2021 Perşembe

Endianness Nedir?

Endianness Kelimesi Nereden Geliyor?
Açıklaması şöyle. Yani büyük adresten başlayınca Big Endian oluyor.
The terms big-endian and little-endian were introduced by Danny Cohen in 1980 in Internet Engineering Note 137, a memorandum entitled "On Holy Wars and a Plea for Peace", subsequently published in print form in IEEE Computer 14(10).48-57 (1981). He borrowed them from Jonathan Swift, who in Gulliver's Travels (1726) used them to describe the opposing positions of two factions in the nation of Lilliput. The Big-Endians, who broke their boiled eggs at the big end, rebelled against the king, who demanded that his subjects break their eggs at the little end.
Endianness Nedir?
Endianness bellekteki bir adresin CPU'daki registerlara hangi sırada yerleştirildiğidir. Örneğin 0x89ABCDEF değeri big endian mimarisinde okunurken ilk register'a 0x89, ikinci register'a 0xAB değeri yerleştirilir. Ancak register'lar üzerinden düşünmek insanlara zor geldiği için genellikle endiannes sanki bellekle alakalıymış gibi düşünülür. Aslında aynı belleği big endian ya da little endian iki işlemciye de taksak olurdu. Çünkü belleği kontrol eden çip endianness bilmez.

İki endian tipinin farkını 4 byte'lık 42 sayısının bellekte nasıl tutulduğunu görerek anlayabilirizGeleneksel olarak bellek byte[0] -> byte1 -> ... şeklinde gösterilir, burada da gelenek takip ediliyor.
|    | byte[0] | byte[1] | byte[2] | byte[3] |
|----+---------+---------+---------+---------|
| BE |       0 |       0 |       0 |      42 |
| LE |      42 |       0 |       0 |       0 |
Gösterim
Örneğin sistemin endiannes değerini anlamak için elimizde şöyle bir kod olsun
int main()
{
  int x = 1;

  char *y = (char*)&x;

  printf("%c\n",*y+48);
}
Bu kod little endian ise şöyle çalışır
       higher memory
          ----->
    +----+----+----+----+
    |0x01|0x00|0x00|0x00|
    +----+----+----+----+
    A
    |
   &x
Big endian ise şöyle çalışır
    +----+----+----+----+
    |0x00|0x00|0x00|0x01|
    +----+----+----+----+
    A
    |
   &x
Her iki durumda da geleneksel gösterim kullanılıyor ve byte lar soldan sağa olacak şekilde yazılırlar. 

İstisnai olarak byte yerine bit kullanan NATO dokümanları bulunur. Bu dokümanlardaki mesajlar bit-oriented oldukları için bitler sağdan sola olacak şekilde yazılıyorlar.  Bit shift işlemleri endian agnostic olduğu için, endianness belirtmek gerekmiyor.


Büyük Endian (Big Endian)
SPARC gibi işlemciler big endian çalışırlar. Yazmaya sağdan başlanır. Yukarıdaki örnekte 42 en sağdan başlanarak yazılıyor. Dolayısıyla geleneksek gösterim açısından değil ancak Big Endian açısından MSB byte[0], LSB ise byte[3]

Eğer ben bu veriyi göndermek istersem önce 3 sonra 2 sonra 1 ve en son 0 numaralı byte'lar gönderilir.

Küçük Endian (Little Endian)
x86 işlemciler ise küçük endian çalışırlar. MSB sağda, LSB ise solda gibi düşünülür. Yazmaya soldan başlanır. Yukarıdaki örnekte 42 en soldan başlanarak yazılıyor. Dolayısıyla geleneksek gösterim açısından değil ancak Little Endian açısından  MSB byte[3], LSB ise byte[0]

Internette Haberleşme
Internette haberleşmek için Big Endian kullanılır. Dolayısıyla Küçük Endian bir işlemci, veriyi gönderirken byte'ları yer değiştirerek gönderir.

Eğer ben bu veriyi göndermek istersem önce 0 sonra 1 sonra 2 ve en son 3 numaralı byte'lar gönderilir.

Örnek
Şu kod parçası c'ye yine ilk byte'ın değerini verir. Yani c = 1 olur
int a = 1;

char c = (char)a;
Örnek
Ağdan gelen bir veriyi - örneğin 4 byte'lık bir diziyi - küçük endian mimaride int'e cast edersek farklı bir sayı elde ederiz. Bir projede ARP isteği içindeki IP adresini int'e çevirip okurken şöyle bir kod kullandım ve bu başıma geldi.
struct sockaddr_in sai;
memcpy (&sai.sin_addr,buffer.data(), buffer.size());
int result = sai.sin_addr.s_addr;
Bit Oriented Mesajlar
Bit Oriented mesajlarda Endianness önemli değildir. Çünkü veri bitler şeklinde okunur ve yazılır. Bu durumda "Bit Numbering" gösterimi önemli hale geliyor.

1. LSB 0 bit numbering
Açıklaması şöyle
When the bit numbering starts at zero for the least significant bit (LSB) the numbering scheme is called "LSB 0".
Yani bitler şöyle gösterilir
7 - 6 - 5 - 4 - 3 - 2 - 1 - 0
2. MSB 0 bit numbering
Bitler şöyle gösterilir. MSB 0 aslında sadece gösterimsel bir şey. IPv4 örneğinde açıklaması görülebilir.
0 - 1 - 2- 3 - 4 - 5 - 6 - 7 
3. Word Olarak 2 Byte Kullanan Mesajlar
Burada da önce hangi byte'ın gönderildiği (transmission) önemli hale geliyor. 
Örnek - 1553
Bir örnek şöyle
Q: Are 1553 packets Big Endian like Ethernet?
A. No, little endian if we are talking about bits. Bit 15 is sent first (15, 14, 13, 12, ....2, 1, 0). Bit 15 - 8 is the Most significant Byte, while bits 7-0 are the least significant Byte.
Örnek - IPv4
Şeklen şöyle. Burada MSB 0 Numbering kullanılıyor.

Açıklaması şöyle
... for the diagram and discussion, the most significant bits are considered to come first (MSB 0 bit numbering). The most significant bit is numbered 0, so the version field is actually found in the four most significant bits of the first byte,
Açıklaması şöyle
The network byte order does not specify how bits are transmitted over the network. It specifies how values are stored in multi byte fields.

Example:

The Total Length field is composed of two bytes. It specifies in bytes the size of the packet.

Lets say we have the value 500 for that field. Using the Network Byte Order it will be seen over the wire like this, being transmitted transmission from left to right:

00000001 11110100
If we would use the little endian format then it would have been seen over the wire like this:

11110100 00000001
After the whole packet is constructed the bits will be sent starting with the lowest addressed bit of the header (bit 0), so the transmission will start with the Version field.
Örnek - NATO Dokümanları
Bu dokümanlarda bit gösterimi genellikle şöyle
15 - 14 - 13 - 12 - 11 - 10 - 9 - 8 - 7 - 6 - 5 - 4 - 3 - 2 - 1 - 0




Hiç yorum yok:

Yorum Gönder