kernel 수정
1) unistd.h에 system call 번호 정의
$ vi arch/arm/include/upai/asm/unistd.h
2) call.S에 System call 처리 함수 등록
$ vi arch/arm/kernel/call.S
3) System call 처리함수 구현
$ vi include/linux/syscalls.h
-> 헤더파일에 먼저 선언
$ vi kernel/mysyscall.c
-> 소스 구현< mysyscall.c> #include <linux/unistd.h> #include <linux/errno.h> #include <linux/sched.h> asmlinkage int sys_mysyscall(int n, int m){ printk("[Hello world!] %d * %d = %d \n", n, m, n*m); // 커널에 출력 return n * m; }
4) kernel 재컴파일
$ vi kernel/Makefile
-> Makefile에 mysyscall.o 추가
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage –j4
-> 커널 rebuild
Library 및 Application 코딩
1) System call Library -> application에서 사용될 수 있도록 라이브러리 추가
$ mkdir ../syscall; cd ../syscall
-> syscall이라는 라이브러리 생성
$ vi newsyscall.c
-> syscall 함수 구현<newsyscall.h> #include "home/ubuntu/working/linux/arch/arm/include/uapi/asm/unistd.h" int mysyscall(int n, int m){ return syscall(__NR_mysyscall, n, m); }
<application -> syscall_app.c> #include <stdio.h> int main(){ mysyscall(3,5); return 0; }