이전 포스트에서 Armv8 아키텍처에서 정의된 레지스터에 대해 알아봤습니다. 레지스터마다 각자 주어진 기능이 있지만 결국 Arm 코어가 사용하는 변수라는 점은 같습니다. 레지스터의 용법을 파악하면 다음과 같은 의문이 생길 수 있습니다. 
 
    "레지스터의 값을 어떻게 읽거나 쓸 수 있을까?"
 
레지스터의 값을 읽거나 쓰려면 명령어를 실행해야 합니다. 그런데 레지스터의 종류에 따라 사용할 수 있는 명령어가 다음과 같이 제한돼 있습니다.

 

 
   * 범용 레지스터: 모든 명령어
   * 시스템 레지스터: MSR, MRS 명령어
 
Armv8에서 정의된 범용 레지스터는 Armv8에서 정의된 모든 명령어에서 볼 수 있습니다. 데이터를 산술 연산하거나 메모리에 위치한 데이터를 읽을 때 사용됩니다. 시스템 레지스터의 값을 읽거나 쓰는 명령어에서도 범용 레지스터를 볼 수 있습니다. 
 
그런데 시스템 레지스터는 MRS, MSR 명령어를 통해서만 접근할 수 있습니다. 한 가지 예를 들어 볼까요?
 
01 MRS x0, SCTLR_EL1 
02 MSR SCTLR_EL1, x0 
 
01번째 줄은 SCTLR_EL1(EL1에 적용되는 시스템 콘트롤 레지스터) 값을 x0 레지스터에 저장하는 명령어입니다. MRS 명령어를 읽을 때는 다음과 같이 옵코드(opcode)의 가장 오른쪽에서 왼쪽 방향으로 해석할 필요가 있습니다.
 
'MRS'은 'MRegisterSystem'로 해석하면 좋은데요. 가장 오른쪽에 있는 S는 System Register, 바로 왼쪽에 있는 R은 Register(범용 레지스터)로 떠올리면 MRS 명령어를 바로 이해할 수 있습니다.
 
이번에는 시스템 레지스터에 값을 쓰는 02번째 줄을 봅시다. 
 
02 MSR SCTLR_EL1, x0 
 
02번째 줄은 EL1에 적용되는 시스템 콘트롤 레지스터(SCTLR_EL1)에 x0 레지스터의 값을 저장하는 명령어입니다. MSR 명령어를 읽을 때도 다음과 같이 옵코드(opcode)의 가장 오른쪽에서 왼쪽 방향으로 해석할 필요가 있습니다.
 
'MSR'은 'MSystemRegister'로 해석하면 좋은데요. 가장 오른쪽에 있는 R은 Register(범용 레지스터), 바로 왼쪽에 있는 S는 System Register 로 떠올리면 MSR 명령어를 쉽게 해석할 수 있습니다. 
 
[중요]
시스템 레지스터는 MSR, MRS 명령어로만 접근할 수 있습니다. 만약에 MRS이나 MSR 명령어가 아닌 'mov x0, SCTLR_EL1'와 같은 명령어를 실행해 시스템 레지스터에 접근하면 Arm 코어는 메모리 어보트 타입 익셉션을 유발합니다.
 
< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>
 
* 유튜브 강의 영상
 
 
 
 
 
.

+ Recent posts