Embedded Linux

커널 컴파일 - 시스템 호출 테스트

작성자 임베디드코리아 작성일24-11-29 22:26 조회597회 댓글0건
< * 시스템 호출 테스트 *>
1. 시스템 호출 함수 정의하기 위하여 커널 소스의 kernel 디렉토리로 접근한다.
    $ cd /usr/src/linux-4.19.9/kernel/

2. 접근 후 여기에서 새로운 시스템 호출 함수를 정의한다.
    $ sudo vi mySysCall_glory.c
    #include <linux/kernel.h>
    #include <linux/linux.h>
    #include <linux/syscalls.h>
    #include <linux/time.h>

    SYSCALL_DEFINE1(mySysCall_glory, in , bday) {


    }

3. Makefile을 열고, obj-y 마지막 부분에 mySysCall_glory.o 를  추가한다.
    $ sudo vi Makefile

4.  시스템 호출 번호 등록
    $ cd /usr/src/linux-4.19.9/arch/x86/entry/syscalls
      이동 후, 64비트를 사용 중이니 syscall_64.tbl을 수정한다.

    $ sudo vi syscall_64.tbl
      시스템 콜 번호는 기존의 마지막 번호 +1을 하고 sys_함수명을 입력한다.
      파일 열고 쭉 내리다 보면 윗부분이 64비트고 아랫부분이 32비트인 것을 확인할 수 있다.
      x32-specific system call ... ~ ... for native 64-bit operation ..~.. 부분 위에 새로운 번호를 등록하고, 정의한 함수를 적는다.
      여기서 번호(나의 경우 335)가 시스템 함수 호출 시 사용되니 기억해야 한다.
      32비트의 경우 제일 맨 밑부분 마지막에 추가하시면 된다.
      마찬가지로 저장 후 vi에디터 종료

4.  시스템 호출 함수 등록
      $ cd /usr/src/linux-4.19.9/include/linux
      시스템 호출 함수의 헤더 파일인 syscalls.h 파일 수정

      $ sudo vi syscalls.h
      syscalls.h 파일 마지막 부분인 #endif 바로 윗줄에 시스템 호출 함수를 적는다

        asmlinkage  long  mySysCall_glory(int);
        #endif

5.  커널 컴파일 및 빌드 & 설치
      시스템 호출 함수를 등록했으니 한번 더 커널을 컴파일해준 다음, 설치 후 재부팅한다.

6.  디렉토리 만들고 시스템 콜 App 작성한다.
      $ mkdir  ~/WORK
      $ cd  ~/WORK
      $ mkdir  SystemCall
      $ cd  SystemCall
      $ sudo vi mySysCall_test.c
        #include <stdio.h>
        #include <linux/kernel.h>
        #include <sys/syscall.h>
        #include <unistd.h>

        int  main() {
                      int  num = 0;
                      printf("input :  ");
                      scanf("%d", &num);
                      syscall(335, num);

                        return 0;
          }
          인자를 가지는 시스템 호출의 경우 syscall(번호,  argument) 이런식으로 호출하면 된다.

7.  gcc를 이용하여 컴파일 및 빌드하고 파일을 실행하여 시스템 호출이 정상적으로 이루어졌는지 확인한다.

        $ gcc  -o  mySysCall_tes  mySysCall_test.c
        $ ./mySysCall_test

        gcc 명령어 사용시  --->
        fatal error : unistd.h : No such file or directory 와 같이 헤더 파일 부재 오류가 발샐하면
          $ sudo apt-get install  libc6-dev

        시스템 호출에 작성했던 printk( )부분은 다음 명령어를 사용하여 확인한다.
        $ dmesg