* 시스템 콜을 추가하기 위해 커널을 수정해야 하는 단계
-------------------------------------------------------
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 |