행복한 하루

Raspberry Pi – Linux Device Driver 만들어 보기-12 (모듈 추가 시 인수 전달하기) 본문

RaspberryPi/DeviceDriver

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

day12_param.zip
0.00MB

 

 

Comments