NDIS 드라이버 공부 내용 정리합니다.

http://www.htsns.com 를 참조해서 작성 되는 내용이므로 정확한 내용을 원하시는 분은 참고하시길 바랍니다.

 

NDIS 드라이버는 Miniport, Intermediate, Protocol 타입의 네트워크 드라이버들을 제공합니다.

3타입의 네트워크 드라이버들이 어떤 역할을 하는지 차근차근 알아보도록 하겠습니다.

 

 

1. Miniport Driver

Miniport Driver(이하 미니포트 드라이버)는 두 가지 역할을 수행합니다.

그림에서 보시는 바와 같이 NIC(Network Interface Card)바로 위에 위치해 있습니다. 미니포트 드라이버는 NIC을 통해 데이터를 보내고 받는 것을 포함해서, NIC을 관리합니다. 또, Intermediate Driver(이하 인터미디엇 드라이버)와 같은 상위 레벨 드라이버들과 통신합니다.

 

미니포트 드라이버는 NDIS 라이브러리를 통해 NIC과 그리고 상위 레벨 드라이버들과 통신합니다. NDIS 라이브러리는 미니포트가 호출하는데 필요한 운영체제의 모든 시스템 함수들을 캡슐화하는 NdisXxx함수들을 익스포트 합니다. 미니포트 드라이버는 상위 레벨 드라이버들이 미니포트 드라이버에 접근하기 위해서 또는, 자기 자신을 위해서 NDIS가 호출하는 엔트리 포인트들(MiniportXxx 함수들)을 익스포트 해야 합니다. 송/수신 연산들(패킷을 보내고 받고 하는 것을 말하는 듯)은 미니포트 드라이버들과 NDIS 상위 레벨 드라이버들간에 상호 작용입니다.

 

- 전송 계층 드라이버가 전송하고자 하는 패킷들을 가지고 있을 때, 전송 계층 드라이버는 NDIS라이브러리에 의해 익스포트 되어지는 NdisXxx 함수를 호출합니다. NDIS는 그러고 나서 미니포트에 의해 익스포트된 적당한 MiniportXxx함수를 호출함으로써 미니포트에게 패킷을 전달합니다. 패킷을 받은 미니포트 드라이버는 적당한 NdisXxx함수들을 호출함으로써 전송을 위해 NIC에게 패킷을 포워드 합니다.

 

- NIC이 패킷을 수신할 때, NDIS 혹은 NIC의 미니포트에 의해 처리될 수 있는 하드웨어 인터럽트를 포스트 할 수 있습니다. NDIS는 적당한 MiniportXxx함수를 호출함으로써 NIC의 미니포트 드라이버에게 알립니다. 미니포트 드라이버는 NIC으로부터 데이터 전송을 설정하고 그리고나서 적당한 NdisXxx 함수를 호출함으로써 바인드된 상위레벨 드라이버들에게 수신된 패킷의 존재를 (Indicate)알립니다.

 

 

2. Intermediate Driver

 

드라이버 계층도에서 보면 인터미디엇 드라이버는 Protocol Driver(이하 프로토콜 드라이버)와 미니포트 드라이버들 사이에 위치합니다. 그래서 "위"의 프로토콜 드라이버와 "아래"의 미니포트 드라이버들과 통신을 수행해야 합니다.

 

- Lower Edge에서 인터미디엇 드라이버는 NDIS가 미니포트 드라이버와 통신하기 위해 호출하는 프로토콜 엔트리 포인트들(ProtocolXxx 함수들)을 노출합니다. 미니포트 드라이버가 인터미디엇 드라이버를 볼 때 인터미디엇 드라이버는 프로토콜 드라이버가 되는 것으로 나타납니다.

 

- Upper Edge에서 인터미디엇 드라이버는 NDIS가 프로토콜 드라이버와 통신하기 위해 호출하는 미니포트 엔트리 포인트들(MiniportXxx 함수들)을 노출합니다. 프로토콜드라이버가 인터미디엇 드라이버를 볼 때 인터미디엇 드라이버는 미니포트 드라이버가 되는 것으로 나타닙니다.

 

- 인터미디엇 드라이버 요약 정리: 인터미디엇 드라이버는 upper edge에서 MiniportXxx 함수들의 subset을 익스포트 합니다. 하지만 실제로 물리 NIC을 관리하지는 않습니다. (NIC의 관리는 Miniport Driver가 합니다.) 그 대신에, 인터미디엇 드라이버 위의 프로토콜들이 바인드 할 수 있는 하나, 혹은 그 이상의 가상 어댑터들을 익스포트 합니다. 그리고 프로토콜 드라이버들은 인터미디엇 드라이버에 의해 익스포트되어지는 가상 어댑터들이 물리 NIC이 되는 것으로 보이게 됩니다.

프로토콜 드라이버가 가상 어댑터(인터미디엇 드라이버가 익스포트 한)에 요구 혹은 패킷들을 보낼 때, 인터미디엇 드라이버는 이런 요청과 패킷을 아래 미니포트 드라이버에 전달하게 됩니다.

 

- 인터미디엇 드라이버는 일반적으로 다음과 같이 사용됩니다.

다른 네트워크의 사이를 변환하기 위해: 예를 들어, Ethernet과 Token Ring 전송 계층들과 ATM 미니포트 사이에 인터미디엇 드라비어의 함수는 Ehternet과 Token Ring 패킷들을 ATM패킷들로 맵하거나 그 반대로 맵합니다.

패킷들을 필터하기: 방화벽 같은 것을 만들 때 사용합니다.

하나 이상의 NIC과 관련해서 패킷 전송의 균형을 맞춘다: 패킷을 분산합니다.(??)

 

 

3. Protocol Driver

드라이버들의 NDIS 계층도에서 가장 위에 있는 프로토콜 드라이버는 TCP/IP혹은 IPX/SPX 스택과 같은 전송 프로토콜 스택을 실행하는 전송 계층 드라이버내에서 가장 낮은 레벨 드라이버로서 사용됩니다. 전송 계층 드라이버는 패킷들을 할당하며 어플리케이션이 보내는 데이터를 패킷에 복사하며, 또 이러한 패킷들을 NDIS 함수들을 호출함으로써 낮은 레벨 드라이버에게 보냅니다. 프로토콜 드라이버는 낮은 레벨 드라이버로부터 들어오는 패킷들을 수신하기 위해 프로토콜 인터페이스를 제공합니다. 전송 계층 드라이버는 수신된 데이터를 요청된 클라이언트 어플리케이션에 전송합니다.

 

Lower Edge에서 프로토콜 드라이버는 인터미디엇 드라이버들과 미니포트 NIC드라이버들에 인터페이스 합니다. 프로토콜 드라이버는 패킷들을 보내기 위해서 NdisXxx함수들을 호출하고, Lower 레벨 드라이버들에 의해 유지된 정보를 읽고 설정하고 운영체제 서비스들을 사용합니다. 프로토콜 드라이버는 NDIS가 수신한 패킷들을 위로 전송하기 위해서 그리고 Lower 드라이버들의 상태를 알기 위해, 혹은 자신의 목적을 위해 호출하는 엔트리 포인트들(ProtocolXxx 함수들)의 집합을 익스포트 합니다.

 

Upper Edge에서 전송 계층 프로토콜 드라이버는 프로토콜 스택에서 상위 레벨 드라이버에 대한 private 인터페이스를 갖게 됩니다.

 

 

4. 정리

위 그림은 이제까지 설명해왔던 내용을 알기 쉽게 나타내 주는 그림입니다. (제 개인적인 생각)

위 그림에서는 Intermediate Driver가 빠져 있습니다. 대신 Wrapper가 포함되어 있죠. 이 것을 보고 여러가지로 생각 할 수 있겠지만 오늘 공부한 내용을 토대로 생각해 본다면 Intermediate Driver는 단순히 Miniport Driver의 Wrapper로 생각할 수 있다는 것입니다. (Miniport <-> Intermediate <-> Protocol 의 관계를 생각해 보세요) Intermediate Driver를 Miniport에 대한 Wrapper로 생각한다면 이해하기가 더 쉽습니다. 어떤 요청이던지 저 방어망을 치고 있는 Wrapper를 뚫지 않고서는 Miniport에게 갈 수가 없습니다. 그리고 Wrapper는 Upper Edge에 대해서는 자신이 Miniport인 것처럼 행세 할 것이며 Lower Edge에 대해서는 Protocol인양 행세 할 것입니다.

다만 NIC과 Miniport Driver와의 관계는 좀 이상하긴 하지만 그거 빼고는 맞는 것 같습니다. (아하하하하하;;)

이 글에서 가장 중요한 것은… 바로 제 프로젝트를 완수 하려면 어떤 드라이버에서 해도 상관 없지만 보통 Intermediate Driver에서 수행한다는 것입니다. (사실 Miniport에서도 할 수 있고 Hook Driver를 만들어서도 할 수 있습니다.)

 

 

 

Bloger: moltak.net

'Programming > WinDriver' 카테고리의 다른 글

NDIS Driver 03) Intermediate Driver 초기화  (0) 2010.05.09
NDIS Extending The PassThru IM Driver  (0) 2010.05.06
NDIS Driver 01) 시작  (0) 2010.05.02
DDK 개발 환경 구축  (0) 2010.04.18
NDIS/TDI  (0) 2010.03.18

+ Recent posts