MY IT

리눅스 커널에 시스템 콜 추가하기

메롱씨티 배드맨 2006. 3. 19. 22:57

* 시스템 콜을 추가하기 위해 커널을 수정해야 하는 단계

-------------------------------------------------------

1. 시스템 콜 이름 및 번호 추가

2. 시스템 콜의 테이블의 처리

3. 추가한 시스템 콜 함수의 코드 구현

-------------------------------------------------------

 

1. 시스템 콜 이름 및 번호 추가

include/asm-i386/unistd.h 파일을 수정한다.

 

커널에 따라 약간의 차이가 있지만, 해당 파일의 맨 아래에 user define 콜을 작성한다.

 

// 맨 아래에 한줄을 추가한다.(번호에 맞추어 작성한다)

#define __NR_mysyscall 253

 

mysyscall 이란 시스템 콜이 253번에 할당되었다.

 

2. 시스템 콜의 테이블 처리

arch/i386/kernel/entry.S  파일의 sys_call_table이라는 테이블에 추가한다.

ENTRY(sys_call_table)

............

.long SYMBOL_NAME(sys_mysyscall) /* mysyscall추가 */

............

.endr

 

ENTRY(sys_call_table) 에서 부터 정확히 253번째에 추가한다.

만약 253번째에

.long SYMBOL_NAME(sys_ni_syscall)

이라고 있다면, 이것은 사용하지 않는 시스템콜을 미리 등록시켜 놓은것이기 때문에 그 부분을 그냥 수정하면 된다.

 

3. 추가한 시스템 콜 함수의 코드 구현

 

* 두가지 방법이 있다.

1) 커널 소스내에 포함하는 방법

 - kernel/ 밑에 있는 커널 파일의 한곳에 추가한다.

 - 예) sched.c (스케쥴링 파일)의 맨 밑에 추가한다.

....asmlinkage int sys_mysyscall( )

....{

.........printk("My name is ik_soub^^\n");

.........return (0);

....}

 

2) 새로운 파일을 만들고 kernel의 Makefile 에 추가하는 방법

- kernel/ 밑에 newsys.c 라는 파일을 만든다.(위의 내용으로!)

- Makefile 을 수정한다.

O_OBJS = sched.o dma.o fork.o ............. newsys.o

 

--> 이후 커널을 재컴파일 한 후 재부팅 한다.(물론 새로 컴파일한 커널로 재부팅해야 한다.)

 

** 새로 작성한 시스템 콜 사용하기.

우선) 시스템 콜을 사용하는 방법

include/asm-i386/unistd.h 파일내에 시스콜 호출에 관한 부분이 있다.

 

#define _syscall0(type, name) \

type name(void) \

{ \

........... \

__syscall_retuen(type,__res); \

}

 

#define _syscall1(type, name, type1, arg1) \

type name(type1 arg1) \

{ \

........... \

__syscall_retuen(type,__res); \

}

 

........... <중략> ..............

 

#define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \

type name(type1 arg1, type2 arg2, type3 arg3) \

{ \

........... \

__syscall_retuen(type,__res); \

}

 

이렇게 해서 type이 6 까지 나간다. 0~6까지 총 7가지의 syscall 이 존재한다.

 

그 이상의 파라미터를 넘기려면 어떻게 해야할까?

알만한 사람은 다 알겠지..(type이 user defined 이잖아!!..)

 

어쨌건.. 위의 syscall의 방식으로 우리가 작성한 시스템콜을 사용한다.

 

[테스트 프로그램]

#include <linux/unistd.h>

_syscall0(int, mysyscall);

 

int mian(void)

{

....int i;

....i = mysyscall();

....return 0;

}

 

*) unistd.h 가 플랫폼에 따라 여러개가 있다. 자신에 맞는 unistd.h 를 정확히 호출하도록..



'MY IT' 카테고리의 다른 글

스누핑 프로그램 심기  (0) 2006.03.22
키보드 해킹  (0) 2006.03.22
스누퍼(ID/PASSWORD 훔치기)  (0) 2006.03.21
Shell로 만든 DB ( Bash-shell)  (0) 2005.08.06
File Lock  (0) 2005.08.03