Menu Close

Red Hat Training

A Red Hat training course is available for RHEL 8

3.13. 사용자 정의 커널 모듈 컴파일

하드웨어 및 소프트웨어 수준에서 다양한 구성에서 요청한 대로 샘플링 커널 모듈을 빌드할 수 있습니다.

사전 요구 사항

  • kernel-devel,gccelfutils-libelf-devel 패키지를 설치했습니다.
  • 루트 권한이 있습니다.
  • 사용자 지정 커널 모듈을 컴파일하는 /root/testmodule/ 디렉터리를 생성하셨습니다.

절차

  1. 다음 콘텐츠를 사용하여 /root/testmodule/test.c 파일을 만듭니다.

    #include <linux/module.h>
    #include <linux/kernel.h>
    
    int init_module(void)
        { printk("Hello World\n This is a test\n"); return 0; }
    
    void cleanup_module(void)
        { printk("Good Bye World"); }

    test.c 파일은 커널 모듈에 기본 기능을 제공하는 소스 파일입니다. 파일은 조직 용도로 전용 /root/testmodule/ 디렉토리에 생성되었습니다. 모듈 컴파일 후 /root/testmodule/ 디렉토리에 여러 파일이 포함됩니다.

    test.c 파일은 시스템 라이브러리에서 포함합니다.

    • 예제 코드의 printk() 함수에는 linux/kernel.h 헤더 파일이 필요합니다.
    • linux/module.h 파일에는 C 프로그래밍 언어로 작성된 여러 소스 파일 간에 공유할 함수 선언과 매크로 정의가 포함되어 있습니다.

      다음으로 init_module()cleanup_module() 함수를 따라 텍스트를 인쇄하는 커널 로깅 함수 printk() 를 시작하고 종료합니다.

  2. 다음 콘텐츠를 사용하여 /root/testmodule/Makefile 파일을 만듭니다.

    obj-m := test.o

    Makefile에는 컴파일러에서 특별히 test.o 라는 개체 파일을 생성해야 하는 명령이 포함되어 있습니다. obj-m 지시문은 결과 test.ko 파일이 로드 가능한 커널 모듈로 컴파일되도록 지정합니다. 또는 obj-y 지시문은 test.ko 를 기본 제공 커널 모듈로 빌드하도록 지시합니다.

  3. 커널 모듈을 컴파일합니다.

    # make -C /lib/modules/$(uname -r)/build M=/root/testmodule modules
    make: Entering directory '/usr/src/kernels/4.18.0-305.el8.x86_64'
      CC [M]  /root/testmodule/test.o
      Building modules, stage 2.
      MODPOST 1 modules
    WARNING: modpost: missing MODULE_LICENSE() in /root/testmodule/test.o
    see include/linux/module.h for more information
      CC      /root/testmodule/test.mod.o
      LD [M]  /root/testmodule/test.ko
    make: Leaving directory '/usr/src/kernels/4.18.0-305.el8.x86_64'

    컴파일러는 최종 커널 모듈(test.ko)에 연결하기 전에 각 소스 파일(test.c)에 대한 오브젝트 파일(test.c)을 중간 단계로 생성합니다.

    컴파일에 성공하면 /root/testmodule/ 에 컴파일된 사용자 지정 커널 모듈과 관련된 추가 파일이 포함됩니다. 컴파일된 모듈 자체는 test.ko 파일로 표시됩니다.

검증

  1. 선택 사항: /root/testmodule/ 디렉토리의 내용을 확인합니다.

    # ls -l /root/testmodule/
    total 152
    -rw-r—​r--. 1 root root    16 Jul 26 08:19 Makefile
    -rw-r—​r--. 1 root root    25 Jul 26 08:20 modules.order
    -rw-r—​r--. 1 root root     0 Jul 26 08:20 Module.symvers
    -rw-r—​r--. 1 root root   224 Jul 26 08:18 test.c
    -rw-r—​r--. 1 root root 62176 Jul 26 08:20 test.ko
    -rw-r—​r--. 1 root root    25 Jul 26 08:20 test.mod
    -rw-r—​r--. 1 root root   849 Jul 26 08:20 test.mod.c
    -rw-r—​r--. 1 root root 50936 Jul 26 08:20 test.mod.o
    -rw-r—​r--. 1 root root 12912 Jul 26 08:20 test.o
  2. kernel 모듈을 /lib/modules/$(uname -r)/ 디렉터리에 복사합니다.

    # cp /root/testmodule/test.ko /lib/modules/$(uname -r)/
  3. 모듈 종속성 목록을 업데이트합니다.

    # depmod -a
  4. 커널 모듈을 로드합니다.

    # modprobe -v test
    insmod /lib/modules/4.18.0-305.el8.x86_64/test.ko
  5. 커널 모듈이 성공적으로 로드되었는지 확인합니다.

    # lsmod | grep test
    test                   16384  0
  6. 커널 링 버퍼에서 최신 메시지를 읽습니다.

    # dmesg
    [74422.545004] Hello World
                    This is a test

추가 리소스