빌트인 vs 모듈 형태 시스템 콜

<1>테이블에 번호를 추가해 빌트인 사용하는 것과
<2>.ko 모듈로 올렸다 내렸다 사용하는 방법 정리 후
모듈로 디바이스 드라이버 구현 시 initcall로 어떻게 시스템 콜이 되는지! 따라가보겠따.

<1> syscall번호를 테이블에 넣어 커널에 빌트인하여 사용

  1. 커널 공간 코드 작성.

     // kernel/hello.c
     #include <linux/kernel.h>
     #include <linux/syscalls.h>
    
     SYSCALL_DEFINE0(hello)
     {
         printk(KERN_INFO "Hello, system call!\n");
         return 0;
     }
    1. Makefile에 추가
  2. linux/arch/arm64/tools/syscall_64.tbl에 번호 추가

  3. 재빌드

    cd linux
    KERNEL=kernel8
    make bcm2711_defconfig
    

time make ARCH=arm64 CROSS_COMPILE="ccache aarch64-linux-gnu-" -j6 Image.gz modules dtbs

sudo make -j6 modules_install

sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image.gz /boot/firmware/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/.dtb /boot/firmware/
sudo cp arch/arm64/boot/dts/overlays/
.dtb* /boot/firmware/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/firmware/overlays/


5. application (유저 코드) 작성
```c
#include <stdio.h>
#include <sys/syscall.h>
#include <unistd.h>

// 커널에서 지정한 syscall 번호 정의
#define __NR_hello 463

int main() {
    long ret;
    ret = syscall(__NR_hello);
    printf("syscall returned: %ld\n", ret);
    return 0;
}

<2> 모듈로 사용할때에 initcall 메커니즘.

  • 대부분 모듈 내에서 디바이스 드라이버 코드로 구현이 가능하다.

비교하여 정리하면,

  • 빌트인 → 안정적, 항상 사용 가능, 커널 수정 필요
    syscall_table[__NR_mycall] = &my_syscall_func;
  • 모듈 → 유연, 테스트 용이, 런타임 등록/해제 가능

재컴파일이 필요없는 커널의 오브젝트가되어 모듈로 올렸다 내렸다 사용하는 방법에 대해 정리에 앞서, 다음 글로 나눠 initcall로 모듈 로드 후 syscall 번호로 어떻게 호출되는지. 알아보겠다.

+ Recent posts