리눅스
네트워크 디바이스 드라이버2
pmj0403
2010. 5. 18. 17:29
반응형
7.3. 네트워크 디바이스 드라이버 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
네크워크 디바이스 드라이버는 데이터의 수신과 전송을 담당한다. 실제적인 네트워크 장치를 제어 하며 상위 프로토콜 레이어에서 내려오는 데이터를 하위의 물리 레이어로 전달한다. 또한, 하위의 물리 레이어에서 올라오는 데이터를 프로토콜 레이어에서 인식할 수 있도록 적절한 연산을 하는 기능도 들어가 있다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
커널은 명확히 정의된 인터페이스를 통해서 네트워크 장치에 접근을 시도하게 되는데 이러한 인터페이스의 구조를 보면 다음과 같다. 이 구조는 include/linux/netdevice.h 에 정의 되어 있는 net_device 구조체의 함수 포인터 필드들이 된다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ 표 7-3-1.네크워크 인터페이스 구조 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
소켓은 어플리케이션과의 인터페이스를 제공하기 위한 API 이다. 소켓에서 사용하는 데이터들은 소켓 버퍼라는 형태로 만들어져서 리눅스에서 제공하는 프로토콜 스택의 처리를 받게 되며 최종적으로 네트워크 디바이스 드라이버에 도달하게 된다. 결국, 네트워크 디바이스 드라이버에서의 쓰기는 소켓 버퍼에 대한 것만 생각하면 된다. 이런 소켓버퍼 구조체의 필드들의 내용을 보면 다음과 같다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ 표 7-3-2. 소켓 버퍼 구조체의 내용 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
이것 이외에도 여러 필드가 존재하지만 그것들에 대해서는 다루어 주지 않아도 상관이 없다. 소켓 버퍼에서 사용하게 되는 함수로는 다음과 같은 것들이 있으며 이것이 프로토타입(Prototype)은 include/linux/skbuff.h에 선언이 되었으며 함수들은 net/core/skbuff.c에서 정의 되어있다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ 표 7-3-3. 소켓 버퍼에서 사용하게 되는 함수 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
위와 같은 함수들을 사용해서 커널로부터 넘겨받은 소켓 버퍼에 대한 연산을 하며, 또한 받은 packet에 대해서 커널로 넘겨주기 전에 소켓 버퍼의 형태로 만들어 준다. 즉, 커널에서는 보내고자 하는 데이터를 소켓 버퍼의 형태로 만들어주며, 넘겨받는 것은 소켓 버퍼라는 것을 가정할 수 있게 된다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
네트워크 디바이스 드라이버의 전체적인 프로그램 구조는 아래와 같으며 이 구조를 대부분이 사용하고 있으므로 이것을 위주로 해서 검증해 보면 된다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
①. Module의 load - 디바이스 드라이버를 모듈로 로딩한다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
②. Device의 검출 - PCI 장치를 검출하며 네트워크 디바이스 드라이버를 커널에 등록한다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
③. Device driver의 초기화 - DMA frame buffer를 초기화하고 멀티캐스팅 어드레스 저장 공간에 대해서 초기화를 한다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
④. Device의 open - 디바이스를 사용하기 위해서 open을 하며 디바이스 드라이버의 초기화 부분을 이곳에서 호출한다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
⑤. Device의 ioctl - IOCTL에 대한 것을 정의한다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
⑥. Device의 close - 디바이스의 사용을 끝내고, IRQ번호의 해지와 DMA를 위해서 할당한 buffer를 해지한다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
⑦. Data transmission(데이터의 전송) - DMA buffer상에 보내고자 하는 데이터를 올려놓고, DMA control를 설정한다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
⑧. Interrupt의 처리 - Transmission의 처리, receive의 처리를 담당하는 것으로 데이터의 전송이 끝이 났거나 혹은 새로운 데이터가 들어왔을 때에 발생하는 인터럽트를 처리하는 것을 목적으로 한다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
⑨. Multicast address의 처리 - 멀티캐스트 어드레스를 관리하는 레지스터에 대한 처리를 담당한다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
⑩. Device의 software reset - 하드웨어적으로 이상이 있거나 혹은 디바이스의 제어를 목적으로 소프트웨어적으로 리셋을 한다. 이것은 특히 하드웨어가 돌이킬 수 없는 상황에 빠질 수도 있으므로 대체적으로 구현을 하는 것이 필요하다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
⑪. Module의 unload - 사용이 끝난 모듈을 메모리에서 제거한다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
즉, 위에서 정의한 것들에 대해서 entry를 가지고 있어야 하며 이러한 entry는 커널에 의해서 사용하게 되므로 인터페이스가 정의된 방법을 따라야 한다. 물론 위에서 말하는 것들에 대해서 전부가 필요한 것은 아니며 Network device driver에서는 다음과 같은 것을 정의 하도록 하고 있다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
드라이버를 설치한 후에는 네트워크 상황에 따라 적절한 설정이 필요한데, 여기에는 IP 주소의 할당 및 network mask, broadcast address를 주며, routing table에 등록 시켜야 한다. 이와 같은 일을 하기위해서는 ifconfig와 route라는 명령어를 사용하여 다음과 같이 설정을 하게 된다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
shell> ifconfig eth0 210.189.178.2 netmask 255.255.255.0 hell> route add -net 210.189.178.0 netmask 255.255.255.0 dev eth0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
위와 같은 설정에서 eth0는 디바이스에 대한 인터페이스 이름이 되며 이너넷 카드가 둘 이상이 존재할 경우에는 eth0, eth1, eth2, .. 순으로 운영체제가 이더넷 장치에 이름을 할당한다. ifconfig 명령을 사용해서 현재 설치된 network device들의 이름을 확인할 수 있을 것이다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
참고로 네트워크 디바이스 드라이버와 관련 된 구조체에 대해 알아보겠다. 네트워크 디바이스만을 위한 net_device 구조체는 /include/linux/netdevice.h 에 정의 되어 있으며 다음과 같다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ 표 7-3-4. net_device 구조체의 내용 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
이곳에서 정의된 모든 필드들을 다 사용하는 것은 아니다. 디바이스가 지원하고자 하는 기능을 위해서 필요한 필드만을 설정 하면 된다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
net_device 구조체의 feature필드를 차지하는 값은 /include/linux/device.h에 아래와 같이 정의된다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ 표 7-3-5. feature 필드 매크로 내용 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
통계정보를 가지는 net_device_stats 구조체는 include/linux/netdevic.h에 아래와 같은 필드로 구성되어 있다. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ 표 7-3-6. net_device_stats 구조체의 내용 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
반응형