본문 바로가기

나의 플랫폼/안드로이드

[ Kernel ] System call 추가 방법 ( ICS )

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안드로이드에 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 디버깅 하는 법은 따로 올리도록 하겠습니다.


그럼 오늘도 즐코딩~