Art of Pr0gr4m

[Linux Kernel 5] Module Programming Basic 본문

IT/Linux Kernel

[Linux Kernel 5] Module Programming Basic

pr0gr4m 2020. 4. 25. 21:49

1. Hello 모듈 작성

 

hello.c

모듈이 초기화 될 때의 엔트리 포인트를 module_init에 등록,

모듈이 제거 될 때의 엔트리 포인트를 module_eixt에 등록

MODULE_LICENSE에 라이센스 기재

 

이 후 빌드를 위한 Makefile 작성

 

Makefile

make 명령으로 빌드 성공 시 hello.ko 커널 오브젝트가 생성됨

 

insmod로 모듈 삽입, rmmod로 모듈 제거

 

hello.ko 삽입 후 dmesg 결과

 

 

2. 모듈 참조

 

callee.c
caller.c

작성한 함수를 외부에 커널 심볼로 공개하기 위해서는 EXPORT_SYMBOL 매크로 사용

 

 

참고로 커널 영역에서 공개되는 심볼 리스트는 /proc/kallsyms에서 볼 수 있음

 

/proc/kallsyms

심볼 타입은 링크 참고

 

 

이 후 Makefile 오브젝트 목록에 callee.o와 caller.o를 추가하여 빌드하면 callee.ko와 caller.ko 생성

 

insmod로 callee와 caller를 차례대로 삽입 (제거 시에는 반대로 제거)

 

 

 

 

3. 의존성 해결

 

2번과 같이 insmod를 차례대로 삽입할 수 있지만, depmod를 이용해서 의존성 해결 가능

 

callee.ko와 caller.ko를 /lib/modules/uname -r/kernel 아래 적당한 곳에 위치 시킨 후

 

depmod -a로 모듈 맵 생성

 

이 후 insmod가 아닌 modprobe를 이용하여 모듈 삽입

 

depmod -n 결과
modprobe로 caller 삽입

결과에서 callee 모듈도 알아서 삽입되어있으며, caller가 callee를 사용하는 걸 확인 할 수 있음

 

 

 

 

4. 매개변수 처리

 

parm.c

모듈에 매개변수를 전달하기 위해서 module_param과 같은 매크로 사용

 

자세한 내용은 링크 참고

 

이 후 Makefile에 오브젝트를 등록하여 빌드

 

파라미터는

 

insmod parm.ko a=100 str=hello

insmod parm.ko b=1,2,3

 

과 같은 방식으로 전달 가능

 

dmesg 결과

매개변수를 입력하지 않거나 일부만 입력해서 전달 또한 가능