티스토리 뷰
나만의 시스템 콜 함수를 정의해보자.
커널에 등록되어 있는 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);
}
'프로그래밍 정보 > Linux' 카테고리의 다른 글
| Ubuntu 20.04 커널 버전 수정해보기 (0) | 2023.10.09 |
|---|---|
| 라즈베리 파이로 리눅스 커널 빌드 따라하기 (1) | 2023.09.09 |
| 라즈베리파이 부트스크립트 만들기 (0) | 2023.09.06 |
| [리눅스] 저수준 파일 입출력과 파일 디스크립터 (0) | 2023.06.05 |
| 리눅스 따라잡기 - 디렉토리(폴더) 이동 (0) | 2022.09.17 |
- Total
- Today
- Yesterday
- 오늘의 공부
- yocto
- 모닝독서
- 재미있는
- Python
- var
- JavaScript
- 포인터
- opencv
- NestJS
- raspberrypi
- 자바스크립트
- 스타벅스
- tailwind
- 20.03.11.(목)
- Til
- 미라클모닝
- C
- SQL
- 라즈베리파이
- tailwindcss
- QT
- JSON
- 초아
- Kernel
- CSS
- Linux
- js syntax
- JS
- variable
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
