안녕하세요.


오늘도 ARM 명령어를 공부해 보겠습니다 ^^

MRC 명령어


MRC 명령어는 코프로세서 명령어 입니다.


MRC 명령어는 코프로세서에서 레지스터로 데이터를 이동하는 명령어 입니다.


코프로세서 명령어??


코프로세서 명령어는 명령어 세트를 확장하기 위해 사용되는 것으로, 


추가의 계산 능력을 제공해 주거나 


캐시와 메모리 관리 장치를 포함한 메로리 서브 시스템을 제어하기 위해 사용 됩니다.


주절주절 써봤지만,


간단히 말해,


CPU를 도와주는 작은 CPU라고 생각하면 편하답니다 ^^


오늘은 그 명령어 사용법을 배우는 것이고요!!


자, 어떻게 동작하는지 프로그램을 작성해 보겠습니다.

1. 프로그램


오늘 프로그램을 이전 프로그램과는 다르답니다.


코프로세서 명령어는 유저 어플리케이션에서는 실행이 되지 않습니다.


그래서 모듈 프로그램을 이용하여 프로그램 해보겠습니다 ^^


모듈 프로그램이라고 해서 겁먹을 필요는 없습니다.


C 언어를 이용한 프로그램이기 떄문입니다. 


모듈 프로그램이 처음이신 분들이라면 다음 링크를 보고 오시면 도움이 되실겁니다 ^^


링크링크~~~~<<<<


다음 프로그램은 mrc 명령어를 이용하여 Main ID Code Register를 읽어 출력하는 프로그램 입니다.


자, 다음 프로그램은 mrc 명령어를 이용한 drv_mrc.c 예제 프로그램 입니다.



#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/module.h>

int asm_mrc_ex ( void );

asm("              
\n\
.global asm_mrc_ex     \n\
asm_mrc_ex:        \n\
mrc p15, 0, r0, c0, c0, 0 \n\
mov     pc, lr  \n\
");

int device_init (void){

int ret;

printk("\nProgram Start\n");

ret = asm_mrc_ex();


printk("Main ID Register = %08X\n\n", ret );

return 0;
}

void device_exit (void){
printk("\nProgram End\n\n");
}

module_init(device_init);
module_exit(device_exit);
MODULE_LICENSE("Dual BSD/GPL");


컴파일이 되시나요~?

2. 프로그램 설명


코드를 하나씩 보겠습니다.


모듈 프로그램은 


모듈 삽입 시 

device_init() 함수가 실행되며,


모듈 제거 시


device_exit() 함수가 실행됩니다.


자, 그럼 모듈을 삽입 해야 우리가 작성한


asm_mrc_ex();


함수가 호출이 되겠죠?


제가 프로그램이 어떻게 실행된다고 했었죠?


맞습니다.


Main ID Code Register를 읽어 온다는 말을 했습니다 ^^


이걸 어떻게 알수 있을까요?


그건 바로! 


다음과 같은 사이트에서 정보를 얻었습니다 ^^


http://www.arm.com/index.php


다음과 같은 정보를요!


다음 내용을 정독하실 필요는 없습니다.


잘 보시면 우리가 필요한 내용이 보이실 겁니다!!


asm_mrc_ex_capture.PNG



자, 프로그램을 실행해 보겠습니다.

3. 프로그램 실행화면


다음은 프로그램 실행 화면 입니다.


asm_mrc_ex.PNG

실행이 좀 이상하죠?

위에 말했듯이 

모듈 삽입 시(insmod drv_mrc.ko) 프로그램이 시작되며,

모듈 제거 시(rmmod drv_mrc.ko) 프로그램이 끝납니다^^

앞으로?

 

다음글에도 역시! ARM 명령어중 하나를 선택하여 프로그램해 보겠습니다. ^^


ps. 오늘은 갑자기 프로그램 유형이 바뀌어서 이해가 안되는 부분들이 있을거라 예상 됩니다, 


궁금하신 사항을 댓글에 남겨주시면 다음 글에는 댓글에 해당하는 내용을 공부해 보겠습니다!