panda.jpg 


안녕하세요 판다 이우영입니다.


오랜만에 비다이스 드라이버를 다루는거 같내요.


오늘은 최근 저를 고생하게 만들었던 module_param에 대해서 알아보려 합니다.


module_param!!



module_param은 디바이스 드라이버가 등록될때 사용자에 의해서 인자값을 받아가는 방법입니다.


특정 변수의 값을 모듈등록을 하면서 초기화 할 수 있는것이죠.


말보다는 바로 테스트를 해보는것이 빠를것 같습니다.



#include <linux/kernel.h>                                                                                                       

#include <linux/module.h>

#include <linux/init.h>


static int user_data  = 0;


int __init module_param_init()

{

    printk("module init \n");

    printk("user_data = %d\n",user_data);


    return 0;

}

void __exit module_param_exit()

{

}


module_init( module_param_init );

module_exit( module_param_exit );


module_param(user_data, int, 0);


MODULE_LICENSE("GPL");

 

module_param 함수를 이용해서 등록해주면은 끝입니다.


인자에는 변수명, 변수타입, 읽기 쓰기 권한 3가지가 필요합니다.

(권한은 간단하게 0을 주셔도 별로 지장이 없어 보입니다.)


변수는 번저 위에처럼 선언 되어 있어야 합니다.


그럼 간단하게 테스트 해볼까요?


01.PNG


그냥 모듈을 등록하면 user_data 는 0입니다. 

그리고 다시 등록할때 인자값으로 10을 입력하니 user_data는 10으로 변해 있습니다.


그러면 초기의 값은 항상 0일까요? 아니죠 라보 처음 user_data변수 선언에 0을 주었기 때문에 0으로 표시되는 겁니다.


만약 static int user_data  = 0; 값을 5로 변경한다면 인자값을 주지않을경우 5로 초기화 될겁니다.


간단하죠?


하지만 저는 여기서 문제가 생겼습니다. 다름아닌 변수의 부호 때문입니다.


저는 인자값으로 메모리 주소를 주려고 했습니다. 값으로 0x8000000 주소대역을 사용하려 했었지요.

저값은 딱 int일때 음수 영역입니다. OTL...


02.PNG


위와같이 음수로 들어가 버립니다.


간단하게 생각하면 module_param(user_data, unsigned int, 0); 하면 될거라 생각했지만

에러가 발생했습니다.


unsigned 부호를 인식하지 못하더군요..;

덕분에 무진장 찾아 보았습니다.


결론적으로 해결책입니다.


module_param(user_data, uint, 0); 


위와같이 unsigned int 형은 uint를 사용해야 합니다.

그러면 이상없이 0x80000000번지 대역을 사용할 수가 있습니다.




그럼 이만 오늘은 마치도록 하겠습니다.