Home 리눅스 커널에 시스템 호출 구현 - ARM Sabre Lite(Kernel.org)
Post
Cancel

리눅스 커널에 시스템 호출 구현 - ARM Sabre Lite(Kernel.org)

  • 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

출처: https://webnautes.tistory.com/554

This post is licensed under CC BY 4.0 by the author.

리눅스 커널 빌드 - ARM Sabre Lite(Kernel.org)

SQLite 빌드 - ARM

Comments powered by Disqus.

Trending Tags