프로그래밍

Miniport drivers

Miniport drivers

NDIS 미니포트 드라이버는 두 가지 기본적인 기능을 가지고 있다:

  • NIC를 통해 데이터 송/수신을 포함하는 Netword Interface Card (NIC) 관리.
  • Filter 드라이버, Intermediate 드라이버 그리고 Protocol 드라이버와 같은 상위 레벨 드라이버와의 인터페이싱.

미니포트 드라이버는 NDIS 라이브러리를 통해 NIC와 상위 레벨 드라이버간에 통신을 한다. NDIS 라이브러리는 미니포트 드라이버가 호출 해야 할 모든 운영체제 함수들(NdisMXxx, NdisXxx 함수)을 제공하고 있다. 미니포트 드라이버는 NDIS가 상위 레벨 드라이버를 대신해 미니포트 드라이버에 접근하거나 자체적인 목적을 수행하기 위해 호출 할 경우를 위해 MiniportXxx 함수와 같은 진입점들의 세트를 익스포트 해야만 한다.

다음은 미니포트 드라이버와 상위 레벨 드라이버 간의 송수신 작업에 대한 상호작용을 보여준다:

  • Transport 드라이버에 전송 할 패킷이 있으면 NDIS 라이브러리에서 Export 된 NdisXxx 함수를 호출한다. 그다음 NDIS는 미니포트 드라이버가 Export 한 해당 MiniportXxx 함수를 호출하여 미니포트 드라이버에 패킷을 전달한다. 그런 다음 미니포트 드라이버는 전송을 위해 적절한 NdisXxx 함수를 호출하여 패킷을 NIC에 전달한다.
  • NIC가 스스로에게 지정된 패킷 주소를 받으면, NDIS 또는 NIC의 미니포트 드라이버에 의해 처리되는 하드웨어 인터럽트를 게시 할 수 있게 된다. NDIS는 적절한 MiniportXxx 함수를 호출하여 NIC의 미니포트 드라이버에게 알리게 된다. 미니포트 드라이버는 NIC에서 데이터 전송을 설정하고 해당 NdisXxx 함수를 호출하여 상위 레벨 드라이버에게 바인드 된 패킷의 존재 여부를 알려준다.

Connectionless and Connection-Oriented Miniport Drivers

NDIS는 비연결 환경과 연결 지향 환경 모두를 위한 미니포트 드라이버를 지원한다.

비연결 미니포트 드라이버는 이더넷과 같은 비 연결 네트워크 미디어 용 NIC를 제어한다. 비연결 미니포트 드라이버는 역직렬화(deserialized)와 직렬화(serialized)로 나눠진다.

NOTE: NDIS 6.0 이상의 모든 드라이버는 역직렬화(deserialized) 드라이버다.

역직렬화(deserialized) 드라이버는 자신의 MiniportXxx 함수의 동작을 직렬화(serialize) 하고 모든 들어오는 송신 패킷을 내부에 있는 큐에 저장한다. 드라이버의 크리티컬 섹션(한 번에 하나의 스레드만 실행할 수 있는 코드)이 작게 유지되면 양방향 통신의 성능이 크게 향상 된다.


직렬화(serialize) 
드라이버는 MiniportXxx 함수 호출을 직렬화(serialize)하고 송신 대기열(send queue)을 관리하기 위해 NDIS를 사용한다.

연결지향 미니포트 드라이버는 ISDN과 같은 연결지향 네트워크 미디어 용 NIC를 제어한다. 연결지향 미니포트 드라이버는 항상 역직렬화(deserialized)한다. MiniportXxx 함수를 직렬화(serialize)하고 모든 들어오는 송신 패킷을 내부적으로 대기(queue) 시킨다.

NDIS 미니포트 드라이버는 non-NDIS lower edge를 가질 수도 있다.

NDIS가 아닌 하단 가장자리를 통해 미니포트 드라이버는 USB와 같은 버스 인터페이스를 사용하여 버스 장치를 제어한다. 미니포트 드라이버는 I/O Request Packet(IRP)를 버스에 보내거나 버스에 연결된 원격 장치에 직접 보내 장치와 통신한다. upper edge에서 미니포트 드라이버는 상위 NDIS 드라이버와 통신 할 수 있게 하는 표준 NDIS 미니포트 드라이버 인터페이스를 제공한다.

링크: https://docs.microsoft.com/ko-kr/windows-hardware/drivers/network/ndis-miniport-drivers2

'프로그래밍' 카테고리의 다른 글

NDIS 드라이버 유형  (0) 2019.06.24
visual studio 2017 에서 Driver 개발  (0) 2019.02.13
MSB8022  (0) 2019.02.13
IrpSp->FileObject  (0) 2017.11.16
IopLoadUnloadDriver  (0) 2014.12.05