Raspberry PI 3에서 시스템 호출(system call ) 구현
라즈베리파이를 위해 새로 컴파일해 본 커널을 이용하여 시스템 콜 추가하는 작업을 해보았습니다.
최초 작성 2014. 10. 15.
최종 업데이트. 2017.11.11.
현재 사용중인 커널 버전입니다.
pi@raspberrypi:~ $ uname -r |
1.시스템 호출 번호 할당
커널 소스 디렉토리의 arch/arm/include/uapi/asm/unistd.h 파일에 새로 생성할 시스템 호출을 위한 고유번호를 할당합니다.
#define __NR_copy_file_range (__NR_SYSCALL_BASE+391) |
arch/arm/include/asm/unistd.h에 정의된 다음 값이 시스템 콜 마지막보다 크므로 변경할 필요는 없어 보입니다.
/* |
2.시스템 호출 테이블에 시스템 호출 처리 함수를 등록
arch/arm/kernel/calls.S에 정의되어 있는데 unistd.h에서 정의했던 시스템 호출 처리함수의 시작 주소들이 들어있습니다.
/* 390 */ CALL(sys_mlock2) |
3.시스템 호출 처리 함수 구현
kernel/helloworld.c라는 파일을 만들고 아래 내용을 작성한다.
#include <linux/unistd.h> |
4.Makefile에 추가
kernel/Makefile파일에 helloworld.o 추가
# |
5.커널을 컴파일한 후, 라즈베리파이로 복사했습니다.
(자세한 커널 컴파일 방법은 다음 포스팅에서 소개하고 있습니다.
Raspberry Pi 3를 위해 커널 크로스 컴파일하기(http://webnautes.tistory.com/547 ) )
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j4 $ scp arch/arm/boot/zImage pi@192.168.43.142:/home/pi |
라즈베리파이에서 커널 이미지를 /boot로 복사해줍니다.
pi@raspberrypi:~ $ sudo cp zImage /boot/kernel7.img |
6. 리부팅 후 다음 소스코드를 라즈베리파이에서 직접 컴파일 하여 실행합니다.
#include <stdio.h> |
dmesg명령으로 확인하면 아래와 같은 문구가 보이게 됩니다.
[ 135.364935] [sys_helloworld] Hello World |