Unix & Linux/Kernel

이번엔 커널 모듈이다 ( Kernel Module)

LEEHANDS 2022. 2. 14. 17:54
반응형

https://tldp.org/LDP/lkmpg/2.6/html/c119.html

커널 모듈이란?

시스템 부팅 후 동적으로 로딩할 수 있는 커널 구성 요소

커널을 다시 컴파일 하거나 재부팅할 필요 없이 커널의 일부분을 교체하는 것이 가능

디바이스 드라이버 , 파일 시스템 , 네트워크 프로토콜 등이 모듈로 제공

 

그럼 일반 응용프로그램하고 뭐가 다른거니?

메인 함수가 없다

대신 커널에 로딩 및 제거 될 때 불러지는 함수가 존재하는데 아래와 같다.

로딩시

module_init()

언로딩시

module_exit()

리눅스 디바이스 드라이버의 특성

1) 커널 코드

디바이스 드라이버는 커널의 한부분이므로, 커널의 다른 코드와 마찬가지로 잘못되면 시스템에 치명적인 피해를 줄 수 있다.

2) 커널 인터페이스

디바이스 드라이버는 리눅스 커널이나 자신이 속한 서브 시스템에 표준 인터페이스를 제공해야한다.

3) 커널 매커니즘 과 서비스

디바이스 드라이버는 메모리할당, 인터럽트 전달,  wait queue 와 같은 표준 커널 서비스를 사용할 수 있다.

--> 하드웨어 엔지니어는 인터럽트 전달이 필요한대 디바이스 드라이버를 만들어야겠다.

 

4) Loadable

대부분의 리눅스 드라이버는 커널 모듈로서 필요할 때 load 하고 더이상 필요하지 않을 때 unload 할 수 있다.

 

5) 설정 가능 (configurable )

리눅스 디바이스 드라이버를 커널에 포함하여 컴파일 할 수 있다. 어떤 장치를 넣을 것인지 커널을 컴파일할 때 설정할 수 있다.

 


간단한 커널 모듈 작성해보자구~

1. helloworld.c

//helloworld.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("LEEHANDS");
MODULE_DESCRIPTION("module programming - hello world module ");

static int __init module_begin(void){
	printk("Hello, linux kernel module. \n");
}

static void __exit module_end(void){
	printk("Good Bye - hello world module. \n");
}

module_init(module_begin);
module_exit(module_end);

Module License 지정 : 

   - license 종류 : GPL ,GPL v2, Dual BSD/GPL, Proprietary 등

   - Kernel 2.6 부터 반드시 지정 필요

 

2. 커널 모튤 프로그램을 위한 makefile

obj-m += helloworld.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

Makefile 이라는 이름으로 위 코드를 붙여 만들어주고, make 하면 아래와 같이 실행

반응형