Bus System을 공부하든, Cortex를 공부하든 Memory와 관련해 Endian, Align라는 단어를 심심치 않게 볼 수 있습니다.
아무래도 어떤 동작을 하기 위해 Memory에 접근하여 Read하고 연산 결과를 Write하는 것이 기본적인 Routine이다 보니
Memory에 대한 내용이 계속해서 나올 수 밖에 없는 것 같아요.
그러다보니 Endian이나 Aligned와 같은 용어들이 꾸준히 등장해주는데 나중에 필요할 때 찾아보기 쉽도록
이에 대해서 한번 정리해놓으려구 합니다 :)


- Endian

Endian이라는 의미를 먼저 짚고 넘어가봅시다.
영어사전에 검색을 해봐도 "메모리 속에서의 데이터 순서를 정하는 .." 정도로 나오는데
위키백과를 보니 Endian은 일반적으로 쓰이던 단어는 아니고 <걸리버 여행기> 이야기에서
달걀을 깰 때 뭉툭한 부분을 먼저 깨는 사람(Big Endian)과 뾰족한 부분을 먼저 깨는 사람들(Little Endian) 사이의 논쟁에서 유래되었다고 하네요.

이 이야기를 메모리에 대입을 해본다면 데이터의 높은 바이트를 먼저 메모리의 낮은 주소에 저장하는 Big Endian과
데이터의 낮은 바이트를 먼저 메모리의 낮은 주소에 저장하는 Little Endian으로 구분할 수 있을 것 같습니다.
글로만 봐서는 와닿지 않으니 한번 그림으로 살펴보겠습니다.

0x12345678

위와같이 32-bit Data 0x12345678이 있다고 가정해봅시다.
참고로 위에 쓰여진 MSB, LSB에 대해 간단히 짚고 넘어가면
MSB는 Most Significant Bit으로 데이터에서 가장 높은 위치의 Bit, 즉 최상위 비트를 의미하고
반대로 LSB는 Least Significant Bit으로 데이터에서 가장 낮은 위치의 Bit, 즉 최하위 비트를 의미합니다.

암튼 위와 같은 데이터를 메모리에 저장을 할 때는 Endian Mode에 따라서 다르게 들어가게 됩니다.
Endian Mode에 따라 메모리에 어떻게 들어갈지 살펴봅시다.

· Little-Endian

Little Endian



Little Endian은 데이터를 메모리에 저장할 때, 최하위 비트부터 낮은 주소에 저장해 나가는 방식입니다.
0x12345678에서 낮은 위치에 있는 Byte 78이 먼저 낮은 주소에 쌓이고
그 다음으로 낮은 위치에 있는 Byte 56이 다음 주소에 쌓이고
다음으로 34, 12 순서로 쌓이므로 왼쪽과 같이 메모리에 저장이 되겠죠.




· Big-Endian

반면에 Big Endian은 데이터를 메모리에 저장할 때, 최상위 비트부터 낮은 주소에 저장해 나가는 방식입니다.
0x12345678에서 가장 높은 위치에 있는 Byte 12가 먼저 낮은 주소에 쌓이고
그 다음으로 높은 위치에 있는 Byte 34가 다음 주소에 쌓이고
다음으로 56, 78 순서로 쌓이면서 왼쪽과 같이 메모리에 저장이 될 것입니다.

그럼 왼쪽과 같이 저장된 애를 Little Endian으로 읽으면 어떻게 될까요?
만약 이를 Little Endian으로 읽는다면
메모리의 낮은 주소에 있는 녀석이 데이터의 낮은 위치(LSB)에 있어야 하기 때문에
0x78563412로 표현되겠네요.


- Aligned

다음으로 Aligned에 대해서 살펴볼게요.
Aligned라는 의미는 정렬되어있다는 의미입니다.
여기서 정렬되어있다는 의미를 이해하기 위해서 시스템에 대한 설명과 같이 연관을 지어보자면
컴퓨터를 하다보면 32-bit 시스템, 64-bit 시스템과 같은 단어가 많이 들립니다.
이들 각각은 32-bit단위로 메모리를 Read/Write하거나 64-bit 단위로 메모리를 Read/Write한다는 의미인데요.
만약 32-bit 시스템을 쓴다면 메모리를 어떻게 Read/Write 하는 걸까요?


32-bit 시스템입니다.
32-bit이라는 것은 4-byte죠.
즉, 각 주소 한칸에는 1-byte의 정보들이 담겨있기 때문에
한번 Read/Write를 할 때, 0x00800000~0x00800003 같이
한번에 4개의 주소를 Read/Write해버린다는 의미입니다.

실제로 32-bit 시스템에서 0x00800000을 Read하면
0x11223344가 Read가 됩니다.

0x00800004를 Read하면 0x55667788이 Read가 되겠구요.




즉 32-bit 시스템이라면 4-byte 단위(4개의 주소)로 Read/Write하기 때문에
접근하는 주소는 4의 배수로 정렬(Aligned)이 되어있어야 하고 Access할 때도 Aligned Access를 해야합니다.
예를들어 4의 배수가 아닌 0x00800001이나 0x00800005에 접근하는 것은 Un-Aligned Access가 되는 것이겠죠.
따라서 16-bit, 32-bit ... 등의 그 Access Size에 맞게 Memory는 Aligned 되어있어야하고 그에 맞게 Access를 해야합니다.
아래는 인터넷을 서치하다가 찾은 표인데 Aligned의 의미를 파악하기 좋은 것 같아 따왔습니다.

Access Size에 따른 Aligned/Un-Aligned


추가적으로
0x00800001, 0x00800002, 0x00800003을 2진수로 바꿔보면
1000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0010
1000 0000 0000 0000 0000 0011 인데
32-bit 시스템에서 0x00800001, 0x00800002, 0x00800003로 Aligned 되지 않은 Access를 하더라도
Aligned된 0x00800000에 접근하게 만들기 위해 불필요한 하위 2-bit를 잘라서 Aligned Access를 만들기도 합니다.


이번 포스트는 쉽게 술술 쓸 수 있을거라 생각했는데 막상 정리하려니 생각보다 까다롭네요.
아직 개념이 부족한거겠죠? :(
그래도 Endian이나 Aligned은 Memory로부터 무언가 읽거나 쓸 때, 기본적인 개념이기 때문에
여러번 공부하면서 잘 체화시켜 놓아야겠어요.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기