Little-Endian / Big-Endian
여태까지 Little-Endian에 익숙해져 있다가,
PowerPC 계열의 440 Core를 쓰면서 Big-Endian을 써보게 되었다.
특별히 고생은 안했지만, 비트를 계산할때 햇갈림은 어쩔수 없는가 보다.
little-endian bit 순서
+--+--+--+--+--+--+--+--+---------+--+--+--+--+--+--+--+--+
|31|30|29|28|27|26|25|24| ~~ |07|06|05|04|03|02|01|00|
+--+--+--+--+--+--+--+--+---------+--+--+--+--+--+--+--+--+
big-endian bit 순서
+--+--+--+--+--+--+--+--+---------+--+--+--+--+--+--+--+--+
|00|01|02|03|04|05|06|07| ~~ |24|25|26|27|28|29|30|31|
+--+--+--+--+--+--+--+--+---------+--+--+--+--+--+--+--+--+
0x11223344 DWORD 데이터 저장 순서
little-endian : 0x44[0] 0x33[1] 0x22[2] 0x11[3]
big-endian : 0x11[0] 0x22[1] 0x33[2] 0x44[3]
Kernel Level에서의 사용 함수
little-endian 기준 작성시 : le32_to_cpu(), le16_to_cpu(), cpu_to_le32(), cpu_to_le16()
big-endian 기준 작성시 : be32_to_cpu(), be16_to_cpu(), cpu_to_be32(), cpu_to_be16()
Application Level에서의 사용 함수
__bswap_32(), __bswap_16() --> #include <bits/byteswap.h>
함수 호출시 무조건 swapping 된다.
서로 다른 Endian에서 생성된 파일을 건드릴 경우 외에는 극히 사용할 필요가 없다.
경우에 따라 ntohl() ntohs() / htonl() htons() 를 사용하는 편이 좋을 수도 있다.
레지스터 컨트롤의 경우 (host[ppc] to pci[little])
DWORD 단위 제어 : cpu_to_le32() / le32_cpu_to() 함수를 어드레스에 무관하게 사용한다.
WORD 단위 제어 : little 기준으로 어드레스 계산 후, cpu_to_le16() / le16_to_cpu() 사용
[출처] little/big-endian|작성자 땅콩과별
'IT' 카테고리의 다른 글
Notion에서 아이펜슬로 그림 추가하는 방법 (0) | 2021.03.14 |
---|---|
2010 문화체육관광부 우수 학술도서 선정~! (0) | 2010.07.31 |
PKI (0) | 2010.05.26 |
콘덴서 읽기 (0) | 2010.05.20 |
전압분배법칙 (0) | 2010.05.20 |