< * 시스템 호출 테스트 *>
1. 시스템 호출 함수 정의하기 위하여 커널 소스의 kernel 디렉토리로 접근한다.
$ cd /usr/src/linux-4.19.9/kernel/
2. 접근 후 여기에서 새로운 시스템 호출 함수를 정의한다.
$ sudo vi mySysCall_glory.c
#include <linux/kernel.h>
#include <linux/linux.h>
#include <linux/syscalls.h>
#include <linux/time.h>
SYSCALL_DEFINE1(mySysCall_glory, in , bday) {
}
3. Makefile을 열고, obj-y 마지막 부분에 mySysCall_glory.o 를 추가한다.
$ sudo vi Makefile
4. 시스템 호출 번호 등록
$ cd /usr/src/linux-4.19.9/arch/x86/entry/syscalls
이동 후, 64비트를 사용 중이니 syscall_64.tbl을 수정한다.
$ sudo vi syscall_64.tbl
시스템 콜 번호는 기존의 마지막 번호 +1을 하고 sys_함수명을 입력한다.
파일 열고 쭉 내리다 보면 윗부분이 64비트고 아랫부분이 32비트인 것을 확인할 수 있다.
x32-specific system call ... ~ ... for native 64-bit operation ..~.. 부분 위에 새로운 번호를 등록하고, 정의한 함수를 적는다.
여기서 번호(나의 경우 335)가 시스템 함수 호출 시 사용되니 기억해야 한다.
32비트의 경우 제일 맨 밑부분 마지막에 추가하시면 된다.
마찬가지로 저장 후 vi에디터 종료
4. 시스템 호출 함수 등록
$ cd /usr/src/linux-4.19.9/include/linux
시스템 호출 함수의 헤더 파일인 syscalls.h 파일 수정
$ sudo vi syscalls.h
syscalls.h 파일 마지막 부분인 #endif 바로 윗줄에 시스템 호출 함수를 적는다
asmlinkage long mySysCall_glory(int);
#endif
5. 커널 컴파일 및 빌드 & 설치
시스템 호출 함수를 등록했으니 한번 더 커널을 컴파일해준 다음, 설치 후 재부팅한다.
6. 디렉토리 만들고 시스템 콜 App 작성한다.
$ mkdir ~/WORK
$ cd ~/WORK
$ mkdir SystemCall
$ cd SystemCall
$ sudo vi mySysCall_test.c
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main() {
int num = 0;
printf("input : ");
scanf("%d", &num);
syscall(335, num);
return 0;
}
인자를 가지는 시스템 호출의 경우 syscall(번호, argument) 이런식으로 호출하면 된다.
7. gcc를 이용하여 컴파일 및 빌드하고 파일을 실행하여 시스템 호출이 정상적으로 이루어졌는지 확인한다.