NDIS(Network Driver Interface Specification)是微软为Windows操作系统设计的一种网络驱动程序接口规范,旨在让网络驱动程序能以设备无关的方式与网络适配器驱动程序通信。这一规范使得协议驱动程序无需了解不同网络适配器的具体细节,只需通过NDIS接口进行交互,大大简化了网络驱动程序的开发。
NDIS驱动程序主要有以下几种类型:
1. **小端口网卡驱动程序(Miniport drivers)**:这些驱动程序专注于处理特定硬件的低级功能,如数据传输和中断处理。它们是最底层的驱动,直接与硬件交互,但并不直接调用操作系统例程,而是通过NDIS来完成与操作系统的交互。
2. **中介协议驱动程序(Intermediate drivers)**:介于协议驱动程序和小端口驱动程序之间,NDIS中间驱动程序可以扮演TDI(Transport Driver Interface)传送器的角色,同时又像一个NDIS驱动程序。它们用于处理网络通信中的数据分组,支持网络适配器的故障容错和负载均衡,例如在微软的网络负载均衡技术中。
3. **上层协议驱动程序(Protocol drivers)**:这些驱动程序主要处理网络协议层面的任务,如TCP/IP、IPX/SPX等。它们通过NDIS接口与小端口驱动程序通信,负责网络消息的读写,而不需要关心具体的网络适配器。
NDIS库(Ndis.sys)在Windows 2000中扮演着关键角色,它作为辅助库,不仅为NDIS驱动程序提供了与TDI服务器交互的接口,还负责将IRP(I/O请求包)转换为对驱动程序的调用。在NDIS 5版本中,引入了反序列化功能,以提高多处理器环境下的性能。驱动程序可以选择不被序列化,直接处理IRP请求,但这样就需要驱动程序自行管理请求的队列和并发。
NDIS模型的目的是提高网络驱动程序的可移植性和易用性,同时也为网络适配器供应商提供了统一的标准,使得他们能够更容易地为Windows操作系统开发驱动程序。NDIS库的使用确保了驱动程序与操作系统的隔离,降低了驱动程序直接处理IRP的复杂性,但这也可能影响到多处理器系统的可扩展性,尤其是在早期的NDIS版本中。
在Windows NT 4.0及其NDIS 4.0版本中,存在三种类型的网络驱动程序:小端口驱动程序、完全的网卡驱动程序(Legacy full NIC driver)以及中间驱动程序。小端口驱动程序更简洁,仅关注硬件特定的操作,而完全的网卡驱动程序则需要处理更多的同步和队列管理任务,这与NDIS的分层思想不符,因此在后来的版本中逐渐被小端口驱动程序所取代。
NDIS驱动程序的基本原理是通过标准化的接口,实现网络驱动程序与操作系统的解耦,简化网络通信的实现,同时提供了一种灵活的方式来处理网络适配器的多样性,以及在网络层和硬件层之间的通信。