행복한 하루
Raspberry Pi – Linux Device Driver 만들어 보기-12 (모듈 추가 시 인수 전달하기) 본문
Raspberry Pi – Linux Device Driver 만들어 보기-12 (모듈 추가 시 인수 전달하기)
변화의 물결 2023. 2. 9. 00:05
안녕하세요.
모듈을 커널에 추가 시 매개변수(Parameter)를 만들어 인수를 받을 수 있도록 해봅니다. 이렇게 하는 것을 모듈을 커널에 추가할 때 특별한 값을 모듈에 내부에 해서 사용할 수 있게 하려고 하는 것입니다. main 함수의 매개변수(argc, argv)와 유사하게 사용하기 위함입니다.
1 모듈 기본 형태 준비
- 이전 내용과 유사하게 드라이버 틀이 만들어진 day1 폴더를 복사해서 수정합니다.
pi@raspberrypi:~/DriverStudy $ cp day1 day12_param -r
pi@raspberrypi:~/DriverStudy $ cd day12_param
pi@raspberrypi:~/DriverStudy $ mv day1_module.c day12_param.c
- Makefile을 수정합니다.
pi@raspberrypi:~/DriverStudy/day12_param $ vim Makefile
obj-m += day12_param.o
2. 소스 수정
- day12_param.c 파일을 수정합니다.
pi@raspberrypi:~/DriverStudy/day12_param $ vim day12_param.c
- 매개변수에 넘어올 값을 저장할 수 있는 변수를 static으로 선언합니다. 정수형과 문자열 타입을 정의하고 초기값을 넣어줍니다.
static unsigned int gpio_nr = 12;
static char *device_name = "param_device";
- module_param 매크로를 사용해서 인수를 받습니다. 첫 번째 인수는 인수 값을 받아 저장할 매개변수명, 두 번째는 자료형, 세 번째는 sysfs의 관련된 파일의 permission으로 파일접근 허가 상수라고 합니다. 여기서 S_IRUGO라고 하면 소유자, 그룹, 그 외 사용자가 이 파일을 읽기 권한만 줍니다.
( #define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH) )
- 참고로, 커널 버전이 2.6.20 이전이라면
MODULE_PARAM으로 사용하고
이후 버전이라면
module_param으로 사용합니다.
module_param(gpio_nr, uint, S_IRUGO);
module_param(device_name, charp, S_IRUGO);
- 모듈에 변수에 대한 설명을 추가할 수 있습니다. 이 내용은 modinfo 명령어를 통해서 확인할 수 있습니다.
MODULE_PARM_DESC(gpio_nr, "Nr. of GPIO to use in the LKM");
MODULE_PARM_DESC(device_name, "Device Name to use in this LKM");
- 모듈이 초기화될 때 인수로 들어온 값을 확인할 수 있도록 출력합니다.
static int __init driver_init(void) {
printk("gpio_nr = %u\n", gpio_nr);
printk("device_name = %s\n", device_name);
(생략)
}
3. 컴파일 및 확인하기
- make로 컴파일을 진행합니다. 그러면 ko 파일이 생성됩니다.
- 인자 값없이 모듈을 커널에 추가하면 기본값이 나타납니다.
pi@raspberrypi:~/DriverStudy/day12_param $ sudo insmod day12_param.ko
pi@raspberrypi:~/DriverStudy/day12_param $ dmesg | tail -5
- 기존의 모듈을 제거하고 인자 값을 입력하여 커널에 추가하면 변경된 값을 확인할 수 있습니다.
pi@raspberrypi:~/DriverStudy/day12_param $ sudo rmmod day12_param
pi@raspberrypi:~/DriverStudy/day12_param $ sudo insmod day12_param.ko gpio_nr=30 device_name=day12_device
pi@raspberrypi:~/DriverStudy/day12_param $ dmesg | tail -5
- 모듈에 대한 정보를 확인하기 위해서 modinfo 명령어를 사용하면 위에서 DESCRIPTION으로 입력했던 내용과 인자에 대한 설명도 볼 수 있습니다.
pi@raspberrypi:~/DriverStudy/day12_param $ modinfo day12_param.ko
감사합니다.
<참고 사이트>
1. Let's code a Linux Driver - 12: Parameters for a Linux Kernel Module
https://www.youtube.com/watch?v=eBEan2xtggI&list=PLCGpd0Do5-I3b5TtyqeF1UdyD4C-S-dMa&index=13
2. 리눅스 모듈 프로그래밍 1 - 모듈 빌드&기본 예제
https://chin0.github.io/kernel,/linux/module_programming_1/
3. 2.6. Passing Command Line Arguments to a Module
https://tldp.org/LDP/lkmpg/2.6/html/x323.html
4. [Linux] 파일 접근 허가 상수
https://dev-overload.tistory.com/34
5. 매개변수(Parameter)와 인수(Argument)의 차이점은 무엇일까?
https://7942yongdae.tistory.com/155