- Kernel.org에서 다운받은 리눅스 커널에 시스템 호출 구현한 다음 수정한 리눅스 커널을 반영한다.
설치 환경
- ‘리눅스 커널 빌드 환경 구축’ 글을 참고하여 리눅스 커널 빌드 환경을 사전에 구축해야 한다.
- 호스트: Ubuntu 18.04
- 타겟: Sabre Lite에 Linux Kernel 4.14.87(PREEMPT_RT 패치 적용)
시스템 호출 파일이 위치하는 디렉터리 생성
1
2
3
4
5
# 다운받은 리눅스 커널 경로로 이동
$ cd ~/<linux kernel path>
# 시스템 호출 디렉터리 생성
$ mkdir syscall_dev
사용자 정의 시스템 콜 구현
1
2
3
4
5
6
7
8
<syscall_dev/test.c>
#include <linux/kernel.h>
asmlinkage void sys_call(void)
{
printk("Hello World!\n");
}
syscall_dev 디렉터리의 Makefile 작성
- make할 때 syscall_dev 디렉터리 내부의 파일이 컴파일 되도록 한다.
1
2
3
<syscall_dev/Makefile>
obj-y := test.o
커널 Makefile에 syscall_dev 파일 추가
- make할 때 syscall_dev 디렉터리가 컴파일 되도록 된다.
1
2
3
4
5
<Makefile>
/* 약 969 라인에 위치 */
기존 : core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/
변경 : core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ syscall_dev/
시스템 콜 처리 함수 등록
- 커널에 등록된 마지막 시스템 호출에 사용자가 구현한 시스템 콜을 추가한다.
1
2
3
4
5
<arch/arm/tools/syscall.tbl>
397 common statx sys_statx
# 시스템 콜 추가
398 common sys_call sys_call
애플리케이션 시스템 콜 호출
- 애플리케이션에서 등록한 398번 시스템 콜을 호출한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
<test.c>
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
syscall(398);
return 0;
}
- 커널 메시지 출력 명령어를 통하여, 398번 시스템 호출 메시지인 “Hello World!”을 확인 할 수 있다.
1
$ dmesg | tail
Comments powered by Disqus.