R&D/OS

리눅스 디바이스 드라이버 제작 (2/5)

sunshout 2010. 6. 6. 15:17

개요
~ 이번 장에서는 리눅스 디바이스의 기본 동작을 위한 함수에 대해서 이해한다.
~ 디바이스 드라이버를 초기화, 제거하는 함수에 대해서 이해한다.

 Event  유저 함수  커널 함수
 Load module  insmod  module_init()
 Open device    
 Close device    
 Read device    
 Write device    
 Remove module  rmmod  module_exit()


디바이스의 동작
~ 디바이스는 유저모드의 함수가 불려지면 해당 함수에 해당하는 커널모드의 함수가 동작함으로써 실제 하드웨어를 제어하게 된다.
~ 예를 들어 디바이스 드라이버를 처음 로드하는 유저모드에서 insmod라는 명령어를 입력한다. 이는 해당 디바이스 드라이버에서 module_init() 함수를 콜하게 되고 디바이스 드라이버를 초기화해 주게 된다.
~ 반대로 유저모드에서 rmmod를 하여 모듈을 내리면 디바이스 드라이버의 module_exit() 함수가 콜되고 디바이스 드라이버를 커널에서 내리게 된다.

1. module_init(), module_exit() 구현

int veth_init_module(void)
{
 
}

void veth_cleanup(void)
{
}

module_init(veth_init_module);
module_exit(veth_cleanup);

~ module_init(), module_exit() 의 파라메터는 실제 init, exit 함수의 포인터를 가리킨다.
~ 즉 커널의 로드,언로드 될 때 module_init(veth_init_module) , module_exit(veth_cleanup) 함수가 콜되고 이는 veth_init_module, veth_cleanup 함수를 실행하게 된다.