AAPCS: 데이터 타입과 정렬

AAPCS(Procedure Call Standard for Arm Architecture)는 ARM 아키텍처의 32비트 모드에서 사용되는 응용 프로그램 바이너리 인터페이스이다. AAPCS에는 데이터 타입의 정의와 정렬 규칙이 포함되어 있어 소프트웨어 개발자들이 데이터의 표현과 메모리 구조에 대한 일관성 있는 접근 방식을 갖도록 지원한다.

기본 데이터 타입

아래 표는 기본 데이터 타입을 보여준다. NULL 포인터는 항상 모든 비트가 0으로 표시된다.

Machine TypeByte SizeByte AlignmentC Type
(signed & unsigned) byte11(signed & unsigned) char
(signed & unsigned) half-word22(signed & unsigned) short
(signed & unsigned) word44(signed & unsigned) int
(signed & unsigned) long int
(signed and unsigned) double-word88(signed and unsigned) long long int
Pointer44T*, T(*F)(), T&

데이터 타입은 프로그래밍 언어에서 값의 종류와 크기를 정의한다. AAPCS는 C/C++에서 사용되는 데이터 타입에 대한 표준 정의를 제공하여 이식성과 호환성을 보장한다. 이러한 정확한 데이터 타입 정의는 메모리 할당과 접근 방식, 연산의 정확성과 성능들을 결정하는데 중요한 역할을 한다. 전체목록은 AAPCS 기본 데이터 타입 항목에서 확인한다.

Endian과 바이트 순서

소프트웨어 관점에서 메모리는 주소 지정이 가능한 바이트 배열이다. Endian은 데이터를 메모리에 저장하는 순서를 나타내는 개념으로 Big Endian과 Little Endian이 있다.

  • Big Endian: 데이터 개체의 최하위 바이트는 데이터 개체가 메모리에서 차지하는 가장 높은 바이트 주소
  • Little Endian: 데이터 개체의 최하위 바이트는 데이터 개체가 메모리에서 차지하는 가장 낮은 바이트 주소

Big Endian

Big Endian에서 데이터 개체의 최하위 바이트는 데이터 개체가 메모리에서 차지하는 가장 높은 바이트 주소에 해당한다.

Big-Endian 데이터의 Memory Layout

Little Endian

Little Endian에서 데이터 개체의 최하위 바이트는 데이터 개체가 메모리에서 차지하는 가장 낮은 바이트 주소에 해당한다.

Little-Endian 데이터의 Memory Layout

복합 타입(Composite Type)

AAPCS에서 복합 타입은 여러 개의 기본 데이터 타입을 조합하여 새로운 데이터 타입을 만드는 것을 말한다. 복합 타입은 다음 중 하나일 수 있다.

  • 집합(aggregate): 멤버들이 메모리에서 순차적으로 배치되는 형태
  • 공용체(union): 각 멤버들이 동일한 주소를 가지는 형태
  • 배열(array): 기본 타입의 반복된 시퀀스로 구성된 형태

이러한 정의들은 재귀적으로 적용 될 수 있으며, 각 타입은 복합 타입을 멤버로 가질 수 있다.

Aggragates(집합체)

가장 많이 사용되는 형태로, 크기는 이러한 규칙에 따라 배치될 때 모든 구성원을 보유하기에 충분한 정렬의 최소 배수여야 한다.

Union(공용체)

역시 가장 많이 사용되는 형태로, 크기는 가장 큰 멤버를 수용하는 데 충분한 정렬의 가장 작은 배수여야 한다.

Array(배열)

배열의 정렬은 기본 타입의 정렬과 동일해야 하며, 크기는 기본 타입의 크기의 배열 요소 수를 곱한 값이다.

Bit-fileds(비트 필드)

기본 데이터 타입은 비트 필드로 세분 될 수 있다.

Homogeneous Aggregates (동일한 형태의 집합체)

해당 타입을 구성하는 모든 기본 데이터 타입이 동일한 경우의 복합 타입이다. 동일한 형태의 테스트는 데이터 레이아웃이 완료된 후에 적용되며, 접근 제어 또는 다른 소스 언어 제한과 관계없이 수행된다.

컨테이너화 된 벡터 타입으로 구성된 집계는 컨테이너화 된 멤버의 내부 형식이 다르더라도 모든 멤버의 크기가 동일하면 같은 타입으로 처리된다. 예를 들어 8바이트 벡터와 4개의 half-word 벡터를 포함하는 구조는 크기가 같으므로 같은 타입으로 처리된다.

각 요소의 기본 데이터 타입인 기본 타입이 있다. 전체 크기는 요소 수를 곱한 기본 유형의 크기이다. 해당 정렬은 기본 타입의 정렬이 된다.

데이터 정렬의 중요성과 이점

데이터의 정렬은 메모리 접근 시 성능을 향상시키고, 버스의 데이터 전송을 최적화하여 시스템 성능을 향상시킨다. 또한 정렬 규칙을 준수하는 것은 이식성과 호환성을 보장하여 다양한 플랫폼과 컴파일러에서 동일한 동작을 기대할 수 있게 한다. 따라서, 데이터 정렬의 중요성을 인식하고 AAPCS 규칙을 준수하는 것은 안정적이고, 효율적인 프로그램 개발을 위해 필수적이다.

참고

AAPCS 소개
AAPCS와 EABI의 관계
AAPCS: 데이터 타입과 정렬
AAPCS: 레지스터 사용
AAPCS: 프로세스 메모리 및 스택
AAPCS: Subroutine Calls(서브루틴 호출)

답글 남기기