안드로이드에 Systemc call을 추가하여 user 단에서 사용 하는 법을 해볼까 한다.
이 내용은 ICS를 기초로 하는 거다.
참고로, 대부분의 안드로이드 폰이 arm기반으로 되어있기 때문에 아래 추가내요은 x86이 아닌 arm에서의 추가방법임.
그럼 차근차근 하나씩 수정해보도록 해보겠다.
1. System Call 등록
- Unistd.h에 System Call 번호 추가
위치 : android/kernel/arch/arm/include/asm/unistd.h
#define __NR_sendmmsg (__NR_SYSCALL_BASE+374)
#define __NR_setns (__NR_SYSCALL_BASE+375)
#define __NR_set_add_function (__NR_SYSCALL_BASE+376)
( 가장 끝 번호 375의 다음 번호를 추가, 이 추가된 번호가 System call 번호가 된다.)
- syscalls.h 에 callback할 함수를 asmlinkage로 추가
위치 : android/kernel/include/linux/syscalls.h
asmlinkage long sys_open_by_handle_at(int mountdirfd,
struct file_handle __user *handle,
int flags);
asmlinkage long sys_setns(int fd, int nstype);
asmlinkage long sys_set_add_function(int value);
※ Systemcall은 함수명으로 링크가 되기 때문에
위 __NR_ + set_add_function 에서 set_add_funtion 이라는 이름에 sys_를 붙여서 위와 같이 셋팅을 해야만 한다.
- calls.s에 system call 함수를 system call table에 등록.
위치 : android/kernel/arch/arm/kernel
/* 375 */ CALL(sys_setns)
/* 376 */ CALL( sys_set_add_function )
※위 번호가 unistd.h에서 추가한 번호인 376와 같아야한다.
이렇게 추가를 해주면 sys_set_add_function 이라는 함수를 system call table에 등록이 되어진다.
이제 부터 등록된 함수를 구현하고 호출하는 방법을 해보도록 하겠다.
2. 등록된 System Call을 구현
- addsystemcall.c 라는 (이름은 자유.) 함수를 구현할 c 파일을 생성.
생성할 위치 : android/kernel/ 안에 어디든지
파일 생성 후 , 다음과 같이 셋팅.
#include <linux/kernel.h>
#include <linux/linkage.h>
#include <linux/sched.h>
#include <linux/unistd.h>
/*
* System call 함수
*/
asmlinkage long sys_set_media_property(int value)
{
printk("%s :: Call System call funtion!!!!! \n", __func__);
return 1;
}
- Makefile에 c파일 등록
위치 : c파일을 생성한 같은 장소의 Makefile
obj-y += addsystemcall.o
위와 같이 추가 시켜 놓는다.
이제 등록 및 구현은 완료 되었다.
남은 것은 user단에서 호출하는 것만 하면 끝~!!
3. System Call을 Usesr단에서 사용 ( Native 소스여야만함. java는 jni를 사용하셔야 할듯)
- user단에서 사용번
위치 : user단에 위치하는 Native 소스라면 가능.
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/unistd.h>
#define __NR_set_media_property (__NR_SYSCALL_BASE+376) // 이렇게 define을 시켜줘야만 한다... 아직 바로 호출 방법은...
// 어떠한 함수 내부
// systemcall 함수에 매개변수로 -1을 넘겨준다.
syscall( __NR_set_media_property,-1);
위와 같이 하면 디버깅 결과는 아실꺼라 생각됩니다.
system 디버깅 하는 법은 따로 올리도록 하겠습니다.
그럼 오늘도 즐코딩~
'나의 플랫폼 > 안드로이드' 카테고리의 다른 글
[ Android.mk ] Android.mk Setting 후, Compile이 안되는 현상. (0) | 2012.10.18 |
---|---|
[ Kernel ] system 디버깅 (0) | 2012.09.18 |
[ Android ] 메모리 누스 (memory leak) (0) | 2012.07.05 |
[ Android ] 카메라 줌 기능 (0) | 2012.06.20 |
[ Android ] 버튼 이미지 변경 ( 코딩 ) (0) | 2012.06.20 |