빌트인 vs 모듈 형태 시스템 콜
<1>테이블에 번호를 추가해 빌트인 사용하는 것과
<2>.ko 모듈로 올렸다 내렸다 사용하는 방법 정리 후
모듈로 디바이스 드라이버 구현 시 initcall로 어떻게 시스템 콜이 되는지! 따라가보겠따.
<1> syscall번호를 테이블에 넣어 커널에 빌트인하여 사용
커널 공간 코드 작성.
// kernel/hello.c #include <linux/kernel.h> #include <linux/syscalls.h> SYSCALL_DEFINE0(hello) { printk(KERN_INFO "Hello, system call!\n"); return 0; }- Makefile에 추가

- Makefile에 추가
linux/arch/arm64/tools/syscall_64.tbl에 번호 추가

재빌드
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 번호로 어떻게 호출되는지. 알아보겠다.
'Linux' 카테고리의 다른 글
| [리눅스 커널과 디바이스 드라이버]애플리케이션->syscall->vfs->디바이스파일open 까지 (2) | 2025.08.17 |
|---|---|
| 리눅스 디바이스 드라이버 - module_init() 모듈 등록부터 사용자 호출까지 (1) | 2025.08.17 |
| U-Boot 부팅 흐름 과정 요약 2 -Linux kernel 로드 (3) | 2025.08.16 |
| UART3 활성화하여 PC와 시리얼 통신[dtoverlay 사용해보기] (1) | 2025.08.16 |
| U-Boot 빌드 과정 흐름 요약 (1) | 2025.08.16 |