오늘도 기록하는 중 GitHub

Linux

리눅스 커널 모듈

YongE 2025. 5. 15. 15:58

🐧 리눅스 커널


리눅스 커널은 하드웨어와 응용 프로그램 간의 중재자로 작동한다. 시스템의 물리적 자원(CPU, 메모리, 장치)을 관리하며, 다음과 같은 주요 기능을 수행한다.

  • 하드웨어 추상화: 복잡한 하드웨어 접근을 단순화하여 사용자 프로그램이 쉽게 활용할 수 있게 한다.
  • 프로세스 관리: PID(Process ID)를 통해 프로세스 스케줄링과 자원 할당을 최적화한다.
  • 메모리 관리: 가상 메모리와 스왑 공간을 활용해 물리적 메모리 이상의 용량을 제공한다.
  • 시스템 호출 제공: read(), write()와 같은 저수준 연산을 표준화된 인터페이스로 노출한다.

이번엔 리눅스 커널 모듈에 대해서 알아보겠다.

✒️ 커널 모듈

리눅스 커널 모듈은 동적으로 로드/언로드 가능한 코드 조각으로, 시스템 재부팅 없이 커널 기능을 확장할 수 있다. 주로 하드웨어 드라이버 추가나 시스템 기능 확장에 사용되며, 모놀리식 커널의 단점을 보완하기 위해 개발되었다.

  • 주요 특징
    • 동적 로딩: insmod/rmmod 명령어로 실시간 제어 가능
    • 메모리 효율: 필요한 기능만 선택적 로딩
    • 개발 편의성: 전체 커널 재컴파일 불필요

📝 기본 모듈 구조

커널 모듈은 초기화 함수정리 함수로 구성되며, 다음 코드는 가장 간단한 형태의 모듈 예제다.

#include 
#include 

static int __init hello_init(void) {
    printk(KERN_INFO "Hello Kernel World!\n");
    return 0;
}

static void __exit hello_exit(void) {
    printk(KERN_INFO "Goodbye Kernel World!\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

🛠 주요 구성 요소

요소 설명
module_init() 모듈 로드 시 실행되는 함수 등록
module_exit() 모듈 제거 시 실행되는 함수 등록
printk() 커널 로그 출력 함수 (printf 대체)
MODULE_LICENSE() 모듈 라이선스 정보 지정

🖥 컴파일 및 빌드

모듈 컴파일을 위해 Makefile이 필요하며, 다음은 최소 구성 예시다.

obj-m += hello.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

컴파일 실행 과정

$ make
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-80-generic'
  CC [M]  /home/user/module/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/user/module/hello.mod.o
  LD [M]  /home/user/module/hello.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-80-generic'

⚙ 모듈 로드/언로드

🔄 주요 명령어 비교

명령어 기능 사용 예시
insmod 모듈 로드 sudo insmod hello.ko
rmmod 모듈 제거 sudo rmmod hello
lsmod 로드된 모듈 확인 lsmod | grep hello
dmesg 커널 로그 확인 dmesg | tail -n 2

🖱 실행해보자.

# 모듈 로드
$ sudo insmod hello.ko

# 로드 확인
$ lsmod | grep hello
hello                  16384  0

# 로그 확인
$ dmesg | tail -n 1
[ 3456.789012] Hello Kernel World!

# 모듈 제거
$ sudo rmmod hello

# 제거 확인
$ dmesg | tail -n 1
[ 3457.891234] Goodbye Kernel World!

⚠ 주의사항: 커널 모듈 개발 시 **루트 권한**이 필요하며, 잘못된 모듈은 시스템 불안정을 초래할 수 있다. 반드시 테스트 환경에서 검증 후 운영 시스템에 적용해야 한다.

생각


현대에 와서 커널 소스가 굉장히 방대해져서 한 사람이 이를 전부 다 아는 건 불가능한 일이다. 관련 서적도 70권 이상 정도 읽어야 높은 수준의 기여를 할 수 있다고 한다. 확실히 직접 해보니 자신이 일정 수준 이상의 전문 지식이 있는 게 아니라면 건들면 안되는 게 맞다. 잘못된 판단은 시스템에 불안정을 초래할 수 있다.

다만 어느 정도 알아둘 필요가 있다고 생각한다. 대부분의 SW는 커널 위에서 동작한다. 단적인 예로 도커가 그렇다. 호스트 커널에 기반해서 동작하며 격리된 환경의 컨테이너를 만든다. 근본적인 연관이 있고 이를 알고 있기만 하더라도 이후에 문제가 발생해도 원인을 빠르게 소명할 수 있지 않을까 한다. 그러니 커널에 관련된 서적을 구매해서 읽어봐야겠다.

반응형

'Linux' 카테고리의 다른 글

시스템 로그 분석 및 모니터링(logrotate)  (0) 2025.05.15
리눅스  (0) 2025.04.28
Shell  (0) 2025.04.23