반응형
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 하면 아래와 같이 실행
반응형
'Unix & Linux > Kernel' 카테고리의 다른 글
리눅스 커널 용어 정리 (2) - make modules_install (0) | 2022.07.05 |
---|---|
리눅스 커널 용어 정리 (1) - zImage , modules , dtbs (0) | 2022.07.04 |
(작성중) ftrace 파헤쳐보자 (0) | 2022.01.28 |
Linux Kernel, Printk & dmesg (0) | 2022.01.28 |
Raspberry Pi Zero W, 커널 컴파일 및 빌드 (0) | 2022.01.13 |