반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

꿈꾸는 사람.

[ARM assembler] MRC, MCR 명령어 본문

IT/HW

[ARM assembler] MRC, MCR 명령어

현무랑 니니 2014. 1. 10. 18:36
반응형









리눅스 커널 소스를 분석하려면 ARM 어셈블리 언어를 알아야 한다.

ARM processor를 제어하는 커널의 핵심 부분이 ARM 어셈블리어로 작성되어 있기 때문이다.

특히 캐쉬,  MMU, TCM, DMA 등을 제어하는 system control coprocessor가 중요하다.

이번 글에서는 system control coprocessor와 ARM 명령어 중 coprocessor 명령을 알아 본다.

그 중 MRC, MCR 명령으로  system control coprocessor를 액세하는 예를 설명한다.


1. Coprocessor interface

ARM 프로세서는 coprocessor interface를 통해 외부 coprocessor들에 연결한다.

ARM 명령어는 16개의 coprocessor들을 지원한다.

예약된 coprocessor 번호

 CP10

 VFP 제어 

 CP11

 VFP 제어 

 CP14 

 디버그와 ETM 제어 

 CP15 

 시스템 제어 


이 인터페이스는 모든 ARM coprocessor 명령을 지원한다.

Coprocessor 명령어 세트

 명령어

동작 

어셈블러 

 CDP

 Data operation

 CDP{cond} <cp_num>, <op1>, <CRd>, <CRn>, <CRm>{, <op2>}

 MRC

코프로세스 레지스터의 정보를 ARM레지스터로 읽어 온다.

 MRC{cond} <cp_num>, <op1>, <Rd>, <CRn>, <CRm>{, <op2>}

 MCR

 ARM레지스터의 정보를 코프로세스 레지스터로 읽어 온다.

 MCR{cond} <cp_num>, <op1>, <Rd>, <CRn>, <CRm>{, <op2>}

 MRRC

 코프로세스의 정보를 한 쌍의 ARM 레지스터들에 전송한다.

 MRRC{cond} <cp_num>, <op1>, <Rd>, <Rn>, <CRm>

 MCRR

한 쌍의 ARM 레지스터들의 정보를 코프로세스에 전송한다.

 MCRR{cond} <cp_num>, <op1>, <Rd>, <Rn>, <CRm>

 LDC

 메모리의 내용을 코프로세스 레지스터에 저장한다.

 LDC{cond} <cp_num>, <CRd>, <a_mode5>

 STC

 코프로세스 레지스터의 내용을 메모리에 저장한다.

 STC{cond} <cp_num>, <CRd>, <a_mode5>


2. System control coprocessor 개요.

System control coprocessor는 ARM 프로세서에서 구현된 기능을 제어하고 상태 정보를 제공한다.

System control coprocessor의 주요 기능은 아래와 같다.

  • 전체 시스템 제어와 구성.
  • 캐쉬 구성과 관리.
  • Tightly-Coupled Memory (TCM) 구성과 관리.
  • Memory Management Unit (MMU) 구성과 관리.
  • DMA 제어.
  • 시스템 성능 모니터링.

3. System control coprocessor 사용 예.

MCR, MRC 명령어

MCR{cond} P15, <Opcode_1>, <Rd>, <CRn>, <CRm>, <Opcode_2>

MRC{cond> P15, <Opcode_1>, <Rd>, <CRn>, <CRm>, <Opcode_2>

MCR, MRC 비트 패턴

 필드

 의미 

 Cond

 명령이 실행될 조건. 

 coproc

 coprocessor의 특정 번호. system control coprocessor는 CP15이므로 "1110" 비트가 된다.

 Opcode_1

 coprocessor의 특정 명령.

 L

  L = 1 이면 MRC, L=0 이면 MCR 명령. 

 Rd

 ARM 레지스터 

 CRn

 액세스할 코프로세서의 레지스터 

 CRm

 coprocessor의 추가 소스 또는 대상 레지스터.

 Opcode_2

 coprocessor의 특정 opcode.


MCR, MRC 사용 예

  • 프로세스 ID 얻기

mrc p15, 0, r6, c0, c0

arch/arm/boot/compressed/head.S의 call_cache_fn 레이블에서 로세스 ID를 읽어오는 코드이다.

mrc p15, 0, r9, c0, c0

arch/arm/kernel/head.S의 stext 레이블에서 시스템이 사용하는 프로세스 ID를 읽어오는 코드이다.

위 명령은 ARM technical reference manual에서 해당 명령을 찾을 수 있다.

  • 캐쉬 무효화

mcr p15, 0, r0, c7, c14, 0

arch/arm/mm/proc-v6.S의 __v6_setup 레이블에서 D-cache를 클린하고 무효화하는 코드이다.

위 내용에서 캐쉬를 지우고 무효화 하는 동작은 CRn = c7, Op1 = 0, CRm = c14, Op2 = 0 으로 설정해야 한다.


반응형

'IT > HW' 카테고리의 다른 글

[ARM] LDM, STM 명령어 사용법  (0) 2013.08.27
Comments