티스토리 뷰

728x90
반응형

나만의 시스템 콜 함수를 정의해보자.

커널에 등록되어 있는 GPIO 함수 설정을 해제하고 내가 직접 만든 GPIO 제어함수를 사용해보자.

(물론 내가 직접 만든 것보다 이미 있는 시스템 콜 함수를 사용하면 좋지만 시스템 콜 함수가 어떤 방식으로 구성되어 있는지 확인하기 위한 삽질이다.)

 

우분투에서 시스템콜 함수 설정 수정 및 함수를 추가한 다음 크로스 컴파일 후 scp를 통해 커널이미지를 넘겨주는 방식으로 진행된다.

:~/pi_bsp/kerenl/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

 

라즈베리파이 menu config에서 기존에 쓰고 있던 gpio 함수를 설정에서 해제하자.

Device Driver-> GPIO SUPPORT->/sys/class/gpio …(sysfs interface) 해제, Character device (/dev/gpiochipN) support 해제

 

소스 및 장치 트리 파일을 빌드한 다음

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage

 

scp arch/arm/boot/zImage pi@xx.xx.xx.xx:~

pi@pi02:~ sudo reboot

 

pi@pi02:ls

gpio가 없으면 된다.

 

 

 

~/pi_bsp/kerenl/linux$ vi include/uapi/asm-generic/unistd.h // 888 shift G

(코드 라인 왼쪽에 있는 번호는 코드 라인 번호이다.)

889 #define __NR_mysyscll 451

890 __SYSCALL(__NR_mysyscall, sys_mysyscall)

 

~/pi_bsp/kerenl/linux$ vi arch/arm/tools/syscall.tbl // 시스템 콜 함수 목록이 들어있다.

//여기에 있는 표준화되어있는 시스템 콜 함수를 이용하여 프로그래밍을 한다.

 

 

~/pi_bsp/kerenl/linux$ vi arch/arm/tools/syscall.tbl

이 파일에는 시스템 콜 함수 목록이 들어있다.

여기에 있는 표준화되어있는 시스템 콜 함수를 이용하여 프로그래밍을 한다.

내가 시스템 콜 함수를 만들어서 사용하려면 이 파일에 내가 만들 함수를 추가해주면 된다.

467 451 common  mysyscall                   sys_mysyscall

 

헤더파일에 추가할 함수를 추가하자.

~/pi_bsp/kerenl/linux$ vi include/linux/syscalls.h

 

1388 asmlinkage long sys_mysyscall(char val[]);

 

 

추가할 함수  sys_mysyscall 작성

:~/pi_bsp/kerenl/linux$ vi kernel/test_mysyscall.c

#include <linux/kernel.h>

asmlinkage long sys_mysyscall(long val)
{
	printk(KERN_INFO "welcom to emebedded System!! app value=%ld\n", val);
	return val*val;
}

 

 

~/pi_bsp/kerenl/linux$ vi kernel/Makefile

 13         async.o range.o smpboot.o ucount.o regset.o test_mysyscall.o

 

커널 이미지를 크로스 컴파일 하자.

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make zImage -j4

 

이미지를 복사하고 리부트를 하면된다.

pi@pi02:~ $ cp zImage /boot/kernel7l.img
pi@pi02:~ $ sudo reboot

 

 

 

 

UserApp 작성

유저앱을 작성하여 등록한 시스템 콜 함수를 실행해보자.

/usr/include/asm-generic/unistd.h 코드 수정(우분투에서 unistd.h 코드 수정하는 내용이랑 같음)

889 #define __NR_mysyscll 451

890 __SYSCALL(__NR_mysyscall, sys_mysyscall)

 

pi@pi02:~/systemcall_test $ vi syscall_app.c

pi@pi02:~/systemcall_test $ vi syscall_app.c
gcc syscall_app.c -o syscall_app

 

pi@pi02:~/systemcall_test $ vi syscall_app.c

 

 

gcc syscall_app.c -o syscall_app

#include <stdio.h>
#include <unistd.h>
#pragma GCC diagnostic ignored "-Wunused-result"
int main()
{
	int i;
	printf("input value = ");
	scanf("%ld",&i);
	i = syscall(__NR_mysycall,i);
	if(i<0)
	{
			perror("syscall");
			return 1;
	}
	 printf("mysyscall return value = %ld\n", i);
}

 

728x90
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함