디스트리뷰터에서 제공하는 시스템 레지스터는 어떻게 접근할까요? 메모리 맵드 I/O 인터페이스를 통해 접근할 수 있습니다.
---
[중요] Arm 아키텍처에서 정의된 레지스터에 접근하는 2가지 방식
Arm 아키텍처에서 정의된 레지스터에 접근하는 방식은 크게 2가지로 분류됩니다.
어셈블리 명령어로 직접 접근
메모리 맵드 인터페이스로 접근
예를 들어 VBAR_EL1과 같은 시스템 레지스터는 MSR 혹은 MRS 명령어를 통해 쓰거나 읽을 수 있습니다. 시스템의 전반적인 속성을 저장하는 레지스터에 접근하는 방식입니다.
디스트리뷰터에서 정의된 시스템 레지스터에 접근하는 두 번째 방식은 '메모리 맵드 I/O 인터페이스'입니다. 접근하려는 I/O 디바이스나 하드웨어의 베이스 주소를 설정한 다음에, 베이스 주소에서 오프셋을 더한 주소에 접근해 레지스터에 접근하는 방식입니다.
특정한 패턴으로 약속한 메모리 주소를 통해 레지스터에 접근할 수 있는 방식입니다.
---
그렇다면 디스트리뷰터를 구성하는 레지스터를 메모리 맵드 인터페이스로 구성한 이유는 무엇일까요? GIC는 0~1024 범위인 인터럽트 아이디(INTID)를 설정할 수 있는데, 이를 위해 각각 레지스터를 정의한다면 1024개 레지스터가 필요합니다.
그래서 디스트리뷰터를 구성하는 레지스터는 다음과 같은 규칙으로 접근할 수 있습니다.
“디스트리뷰터 베이스 주소 + 오프셋”
위에서 명시된 오프셋은 디스트리뷰터의 세부 동작 별로 지정됩니다.
다음 표에서 디스트리뷰터에서 제공하는 레지스터 별 오프셋을 확인할 수 있습니다.

표 16.4 디스트리뷰터 레지스터와 오프셋 목록
디스트리뷰터 베이스 주소에 위 표에서 명시된 오프셋을 더한 주소에 접근하면, 디스트리뷰터 레지스터에 접근할 수 있는 방식입니다.
GIC를 구성하는 디스트리뷰터와 리디스트리뷰터에서 제공하는 시스템 레지스터는 위와 같이 메모리 맵드 방식으로 접근할 수 있습니다.
최근 덧글