커널 모듈 (insmod, lsmod, rmmod) 커널 API

2025. 7. 30. 15:46·Linux

로드 가능한 커널 모듈 (Loadable Kernel Module)

  • 커널 이미지에 포함X -> 부팅시간, 메모리 절약
  • 커널에 덧 붙여서 커널의 기능 확장
  • 커널 주소 공간에서 실행
  1. linux/drivers/ 로 이동
  2. comento dir생성
  3. linux/drivers/comento에서 Kconfig, Makefile 생성

<linux/drivers/comento/Kconfig> 설정

menu "Comento Example Driver" # 메뉴 이름 설정

config COMENTO_EXAMPLE
	tristate "Comento Example Driver Module" # 3가지 옵션, y m n 사용가능
    help
    	This is an Example
 
endmenu # 메뉴 그룹 종료
  • 드라이버 모듈 설정 옵션을 정의

 

<linux/drivers/comento/Makefile> 설정

obj-$(CONFIG_COMENTO_EXAMPLE) += comento.o
comento-objs += main.o
  • CONFIG_COMENTO_EXAMPLE은 m으로 설정
  • obj-m += comento.o로 확장
    • comento.o는 모듈로 빌드 -> comento.ko 생성

<linux/drivers/Kconfig> 설정

...
...

source "drivers/comento/Kconfig"

마지막 부분에 추가

  • 파일의 내용을 현재 위치에 포함

<linux/drivers/Makefile> 설정

...
...

obj-y += comento/

마지막 부분에 추가

  • 해당 디렉토리/하위디렉토리를 전부 포함해서 빌드 대상으로 추가

커널에 새로운 모듈 추가

<linux/drivers/comento/main.c> 작성

#include <linux/module.h>

static int __init comento_module_init(void)
{
	printk(KERN_DEBUG "module [%s] init \n", __func__);
    return 0;
}

static void __exit comento_module_exit(void)
{
	printk(KERN_DEBUG "module [%s] exit \n", __func__);
}

module_init(comento_module_init);
module_exit(comento_module_exit);

MODULE_AUTHOR("Jin Minu");
MODULE_DESCRIPTION("Example Drvier");
MODULE_LICENSE("GPL v2");

코드 작성 후,

  1. 커널 재 빌드
  2. rootfs를 임시로 mnt디렉토리에 마운트
  3. 완성된 모듈 .ko 파일을 mnt/usr/lib/modules/ 에 복사
  4. sync
  5. umount 실행
  6. QEMU 실행
  7. insmod, lsmod, rmmod 로 모듈 로드/언로드
  8. dmesg로 확인

Kernel API

  • 메모리 관련
  • 더블 링크드 리스트
  • 해시테이블
  • 뮤텍스
  • 스핀락

1. 메모리 관련

  • copy_from_user(to, from, size) : 사용자 공간 -> 커널 공간으로 메모리 복사
  • copy_to_user(to from, size) : 커널 공간 -> 사용자 공간 메모리 복사
  • kmalloc(size, type) / kzalloc(size, type) : 커널 공간에서 메모리 동적 할당
    • type: GFP_KERNEL, GFP_ATOMIC, GFP_DMA

2. Doubly Linked List

  • linux/list.h에 정의
  • list_head 구조체 사용

API

  • LIST_HEAD(name)
  • list_add(new, head) / list_add_tail(new, head)
  • list_del(target)
  • list_empty(head)
  • list_for_each_safe(node, temp, head, member_name)

3. Hash Table

API

  • DEFINE_HASHTABLE(name)
  • hash_add(table, new, key)
  • hash_del(target)
  • hash_for_each_possible(table, node, member, key)
  • hash_for_each(table, bkt, node, hash)

4. Mutex

  • 동시에 접근하면 안되는 부분 지정 -> 하나의 변수를 동시에 수정한다면 문제 발생
  • 접근해서 작업이 오래걸릴 것을 예상 -> 컨텍스트 스위칭 발생
  • 바로바로 작업이 끝나고, 제어권 변경?? -> 스핀락 유리

API

  • DEFINE_MUTEX(name)
  • mutex_locK(mutex)
  • mutex_unlock(mutex)

5. Spinlock

  • 뮤텍스와 비슷, But 무한루프 사용해서 상태 바뀔 때까지 대기 -> 컨텍스트 스위칭 안함
  • Read-Write lock 형태 많이 사용
    • 데이터 read할 땐 여러 프로세스 허용
    • 데이터 write할 땐 하나의 프로세스만 허용
      • 쓸 때 읽는 것도 허용X

API

  • DEFINE_RWLOCK(name)
  • read_lock(mutex) / write_lock
  • read_unlock(mutex) / write_unlock

6. Current task

  • current: 현재 프로세스 참조, 전역변수, 커널 아무대서나 사용
  • aarch64에서는 특정 레지스터에 주소 보관
  • macro, inline함수

 

'Linux' 카테고리의 다른 글

objdump활용 vmlinux 분석시 start address의미  (0) 2025.09.11
디바이스 드라이버  (0) 2025.08.01
ls 명령어 분석 with strace  (1) 2025.07.29
Kernel 및 System call 디버그 with GDB  (0) 2025.07.28
커널 시스템콜 추가  (3) 2025.07.25
'Linux' 카테고리의 다른 글
  • objdump활용 vmlinux 분석시 start address의미
  • 디바이스 드라이버
  • ls 명령어 분석 with strace
  • Kernel 및 System call 디버그 with GDB
Minu Jin
Minu Jin
정보의 바다
  • Minu Jin
    뇌 구조가 바이너리
    Minu Jin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
        • start_contribute()
        • start_analyse()
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Branch
    동적메모리
    토발즈
    자료구조
    파이썬
    yolo
    백준
    피보나치
    INIT
    rubikpi3
    rubik pi
    c언어
    커널 기여
    순환
    포인터
    시스템콜
    리눅스
    commit
    커널
    파일 입출력
    드라이버 분석
    소수
    앤드류모튼
    Qualcomm
    이진 트리
    arm
    C++
    스택
    Git
    버퍼
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Minu Jin
커널 모듈 (insmod, lsmod, rmmod) 커널 API
상단으로

티스토리툴바