라즈베리파이를 위해 새로 컴파일해 본 커널을 이용하여 시스템 콜 추가하는 작업을 해보았습니다.
최초 작성 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 |
'Raspberry Pi > Linux Device Driver Programming' 카테고리의 다른 글
C언어로 Raspberry Pi 3의 GPIO 레지스터 접근하여 버튼값 읽어오기 (2) | 2019.02.18 |
---|---|
C언어로 Raspberry Pi 3의 GPIO 레지스터 접근하여 LED켜보기 (5) | 2019.02.18 |
Raspberry Pi 3에서 커널 모듈(kernel module) 프로그래밍 (3) | 2017.11.13 |
Raspberry PI 3에서 시스템 호출(system call ) 구현 (4) | 2017.11.11 |
Raspberry Pi 3를 위해 커널 크로스 컴파일하기 (3) | 2017.11.11 |
Raspberry Pi 2에서 character device driver 예제 테스트 (0) | 2015.10.17 |
Raspberry Pi 2에서 Linux Kernel Module 작성하기 (0) | 2015.10.17 |
리눅스 문자 디바이스 드라이버 예제 (0) | 2015.02.22 |
포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.
여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다.
감사합니다 ~~
유튜브 구독하기
제가 쓴 책도 한번 검토해보세요 ^^
-
김창대 2016.03.24 11:39
안녕하세요? 저도 영문을 몰라 헤매고 있었는데, 이 글을 보고 해결했습니다. 감사합니다.
4배수 법칙의 근거는 모른다고 하셨는데,
arch/arm/kernel/calls.S 제일 아랫부분에 있는
#ifndef syscalls_counted
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
#define syscalls_counted
#endif
.rept syscalls_padding
CALL(sys_ni_syscall)
.endr
이 부분 때문인 것 같습니다.
syscalls_padding = ((NR_syscalls + 3) & ~3) - NR_syscalls = NR_syscalls % 4
가 되는 것 같고, 그 아래에 syscalls_padding 숫자만큼 sys_ni_syscall을 추가하니까요.
왜 이런 padding이 들어갔는지까진 모르겠지만...cache라든가 memory에 align 맞추려고 한 건 아닐까 싶습니다.
(저는 오드로이드 보드에서 작업하던 거라 코드가 약간 다를 수는 있습니다.)
-