B.4. 시스템 콜 추가

시스템 콜을 추가해보자. 우선 새로운 시스템 콜이 들어있는 파일을 만들자($TOPDIR)/kernel/mysyscall.c
/* $(TOPDIR)/kernel/mysyscall.c */
#include <linux/linkage.h>

asmlinkage int sys_mysyscall()
{
	printk("My First System Call.\n");
}

$(TOPDIR)/include/asm/unistd.h에 새로운 시스템 콜을 위한 번호를 추가한다.
...
#define __NR_vfork	190
#define __NR_mysyscall	191

$(TOPDIR)/i386/kernel/entry.S에 있는 시스템 콜 테이블에 등록한다.
ENTRY(sys_call_table)
	...
.long	SYSBOL_NAME(sys_mysyscall)
.rept NR_syscalls-191

커널을 컴파일하는데 위에서 만든 mysyscall.c를 Makefile에 등록해 준다. 간단히 'O_OBJS='이란 줄에 mysyscall.o라고 추가해주면 된다.

커널 컴파일이 끝나면 새로운 커널을 설치하고 재부팅한 다음 아래와 같은 테스트 프로그램을 만들어 실행해 보자.
/* test.c */
#include <linux/unistd.h>

_syscall0(int, mysyscall);

int main()
{
	int i;

	i = mysyscall();

	return i;
}

테스트 프로그램을 실행했을 때 화면에 'My First System Call'이라고 출려되면 다행인데 아무런 출력도 없다면 dmesg를 사용해 커널 출력을 확인해 보자. 제일 끝에 문장이 제대로 찍혔는가?