일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 문파문파 공략
- 애플
- 야구
- 우분투
- 타이젠
- 해외직구
- 블로그
- 단통법
- ubuntu
- 손민한
- 문파문파
- 프로야구
- 태그를 입력해 주세요.
- 김경문
- NC다이노스
- NC 다이노스
- 뉴스타파
- 디자인 패턴
- arm
- ubuntu 12.04
- mysql
- 정보시스템감리사
- 조세피난처
- 데이터베이스
- Linux
- 국정원
- 인공지능
- 안드로이드
- Tizen
- 리뷰
- Today
- Total
꿈꾸는 사람.
[ARM assembler] MRC, MCR 명령어 본문
리눅스 커널 소스를 분석하려면 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 |
---|