일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- kafka
- Network
- lruvec
- 카프카
- strex
- spinlock
- kmalloc
- vm_area_struct
- page
- Apache
- BLOCK
- Android
- commit
- NDK
- fastpath
- vmalloc
- blk-mq
- memory
- Kernel
- slub
- devicedriver
- slowpath
- Linux
- slab
- multiqueue
- pmap
- mm_struct
- proc
- buddy_system
- allocator
- Today
- Total
Art of Pr0gr4m
[Linux Kernel 5] Module Programming Basic 본문
1. Hello 모듈 작성
모듈이 초기화 될 때의 엔트리 포인트를 module_init에 등록,
모듈이 제거 될 때의 엔트리 포인트를 module_eixt에 등록
MODULE_LICENSE에 라이센스 기재
이 후 빌드를 위한 Makefile 작성
make 명령으로 빌드 성공 시 hello.ko 커널 오브젝트가 생성됨
insmod로 모듈 삽입, rmmod로 모듈 제거
2. 모듈 참조
작성한 함수를 외부에 커널 심볼로 공개하기 위해서는 EXPORT_SYMBOL 매크로 사용
참고로 커널 영역에서 공개되는 심볼 리스트는 /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를 이용하여 모듈 삽입
결과에서 callee 모듈도 알아서 삽입되어있으며, caller가 callee를 사용하는 걸 확인 할 수 있음
4. 매개변수 처리
모듈에 매개변수를 전달하기 위해서 module_param과 같은 매크로 사용
자세한 내용은 링크 참고
이 후 Makefile에 오브젝트를 등록하여 빌드
파라미터는
insmod parm.ko a=100 str=hello
insmod parm.ko b=1,2,3
과 같은 방식으로 전달 가능
매개변수를 입력하지 않거나 일부만 입력해서 전달 또한 가능
'IT > Linux Kernel' 카테고리의 다른 글
[Linux Kernel 5] proc & seq_file (0) | 2020.05.02 |
---|---|
[Linux Kernel 5] Crypto Device Driver (0) | 2020.04.30 |
[Linux Kernel 5] Character Device Driver IOCTL (0) | 2020.04.30 |
[Linux Kernel 5] Character Device Driver (3) | 2020.04.30 |
[Linux Kernel 5] system call 추가하기 (0) | 2020.04.24 |