无线局域网NDIS小端口驱动实现
发布时间:2007/8/20 0:00:00 访问次数:541
1 引言
无线局域网经过几年的发展,在技术上已经日渐成熟。尤其是IEEE推出802.11-1999和802.11b以来,应用也日渐广泛。无线局域网硬件实现的两大主要部分是基带处理器和MAC控制器,软件部分包括驱动网卡本身工作的嵌入式软件和网络设备驱动程序。在本文中,首先介绍了小端口驱动程序的基本要点,然后给出了基于Driver Studio开发PCMCIA接口编程I/O(Programmed IO)方式工作的无线局域网网卡NDIS(网络驱动程序接口标准),并讨论了小端口驱动程序实现过程中的若干关键技术的细节。
2 小端口驱动程序
在典型的网络中,如以太网LLC子层及其上层协议均由软件实现,MAC及其以下层协议由硬件实现。微软Windows操作系统下的网络设备驱动程序遵守NDIS规范,它在分层的网络驱动程序框架中规定了一个标准接口,从而使抽象低层次的硬件提供了高层次网络上的网络管理。因此,该规范极大简化了设备特定网络驱动程序的开发。
NDIS还用于网络驱动器的状态信息和参数的维护,包括函数的指针、句柄、链接的参数块和其他的一些系统变量。NDIS规范下的网络驱动程序分为三类:小端口驱动程序、中间驱动程序和协议驱动程序。普通网卡的驱动程序都是小端口驱动程序,它有两种基本功能:管理一个网络接口卡(NIC),包括通过NIC收、发数据;与高级驱动程序接口(如中间驱动程序和传输协议驱动程序)。一个小端口NIC驱动程序通过NDIS库和它的NIC与高层驱动程序相互通讯。NDIS库 导出一个完全的函数集合(NdisXXX函数),来装入小端口需要调用的操作系统函数。然后,小端口必须导出一套MiniportX xx函数的实体指针,可供NDIS自己使用或代替高层驱动程序访问小端口。
关于网络设备驱动程序和Windows驱动程序模型,感兴趣的读者可以参考文献[3]。
3 无线网卡驱动程序框架
标准的驱动程序都是C语言写的,Nu Mega公司却通过引入C++和封装基本的函数库简化了驱动程序的设计。
使用DriverStudio编写网络驱动程序,首先需要使用NetworkDriver Wizard生成驱动程序的框架。该框架生成两个驱动程序的基本类:一个是 wlan_drvDriver,它是KndisMiniDriver的继承类;另一个驱动程序必须且只有一个KndisMiniDriver的继承类。wlan_drvDriver的定义如下
class wlan_drvDriver : protected
KNdisMiniDriver
{
protected:
// must implement the entry point
NTSTATUS DriverEntry(IN PVOID RegistryPath);
};
NTSTATUS wlan_drvDriver::DriverEntry(IN PVOID)
{
TRACE("wlan_drvDriver::DriverEntry Com piled at " __TIME__ " on " __DATE__ "\n");
KNDIS_MINIPORT_CHARACTERISTICS Chars;
return Chars.Register(*this);
}
wlan_drvDriver的唯一工作是定义DriverEntry。操作系统通过该函数得知驱动程序的入口。DriverEntry例化NetworkDriver Wizard生成的另外一个类wlan_drvAdapter,并将本驱动程序注册。
wlan_drvDriver类不用开发者干预。开发者需要关心的是另外一个类wlan_drvAdapter,它是KndisMiniAdapter的子类。
4 驱动程序的初始化
wlan_drvAdapter类的实现是整个驱动程序的主体部分,包括初始化驱动程序、发送数据、接收数据、中断处理、网卡复位等。
驱动程序在被装入操作系统后的第一步工作是进行初始化。该工作由wlan_drv Adapter::Initialize函数完成。该函数完成的工作如下:
(1)选择媒体类型。对于无线局域网为 NdisMedium802_3,而不是NdisMedium-WirelessWan。声明为 NdisMediumWirelessWan将支持各种无线媒体类型,NdisMedium802_3原本为以太网设计,这里无线局域网似乎应该声明为NdisMediumWirelessWan媒体类型,但事实并不是这样。通过查询OID_GEN_PHYSICAL_MEDIUM,协议驱动程序可以得知物理媒体为NdisPhysical-MediumWirelessLan类型。
(2)从注册表读取网卡地址。
(3)注册适配器的类型,如指定设备为 NdisInterfacePcMcia,代表网卡为PCMCIA标准的PC Card。这里需要强调的是PCMCIA接口的配置存储器和功能寄存器都是由主机自行维护的,虽然驱动程序也可以读写配置存储器和功能寄存器,但这样做会导致系统工作的不一致,除非特别需要,驱动程序无需读写配置存储器和功能寄存器。
(4)选择并注册IO端口。
(5)选择并注册中断。
(6)设定网卡所支持的包种类,如广播中的多播等。
(7)设定网卡的MAC属性
1 引言
无线局域网经过几年的发展,在技术上已经日渐成熟。尤其是IEEE推出802.11-1999和802.11b以来,应用也日渐广泛。无线局域网硬件实现的两大主要部分是基带处理器和MAC控制器,软件部分包括驱动网卡本身工作的嵌入式软件和网络设备驱动程序。在本文中,首先介绍了小端口驱动程序的基本要点,然后给出了基于Driver Studio开发PCMCIA接口编程I/O(Programmed IO)方式工作的无线局域网网卡NDIS(网络驱动程序接口标准),并讨论了小端口驱动程序实现过程中的若干关键技术的细节。
2 小端口驱动程序
在典型的网络中,如以太网LLC子层及其上层协议均由软件实现,MAC及其以下层协议由硬件实现。微软Windows操作系统下的网络设备驱动程序遵守NDIS规范,它在分层的网络驱动程序框架中规定了一个标准接口,从而使抽象低层次的硬件提供了高层次网络上的网络管理。因此,该规范极大简化了设备特定网络驱动程序的开发。
NDIS还用于网络驱动器的状态信息和参数的维护,包括函数的指针、句柄、链接的参数块和其他的一些系统变量。NDIS规范下的网络驱动程序分为三类:小端口驱动程序、中间驱动程序和协议驱动程序。普通网卡的驱动程序都是小端口驱动程序,它有两种基本功能:管理一个网络接口卡(NIC),包括通过NIC收、发数据;与高级驱动程序接口(如中间驱动程序和传输协议驱动程序)。一个小端口NIC驱动程序通过NDIS库和它的NIC与高层驱动程序相互通讯。NDIS库 导出一个完全的函数集合(NdisXXX函数),来装入小端口需要调用的操作系统函数。然后,小端口必须导出一套MiniportX xx函数的实体指针,可供NDIS自己使用或代替高层驱动程序访问小端口。
关于网络设备驱动程序和Windows驱动程序模型,感兴趣的读者可以参考文献[3]。
3 无线网卡驱动程序框架
标准的驱动程序都是C语言写的,Nu Mega公司却通过引入C++和封装基本的函数库简化了驱动程序的设计。
使用DriverStudio编写网络驱动程序,首先需要使用NetworkDriver Wizard生成驱动程序的框架。该框架生成两个驱动程序的基本类:一个是 wlan_drvDriver,它是KndisMiniDriver的继承类;另一个驱动程序必须且只有一个KndisMiniDriver的继承类。wlan_drvDriver的定义如下
class wlan_drvDriver : protected
KNdisMiniDriver
{
protected:
// must implement the entry point
NTSTATUS DriverEntry(IN PVOID RegistryPath);
};
NTSTATUS wlan_drvDriver::DriverEntry(IN PVOID)
{
TRACE("wlan_drvDriver::DriverEntry Com piled at " __TIME__ " on " __DATE__ "\n");
KNDIS_MINIPORT_CHARACTERISTICS Chars;
return Chars.Register(*this);
}
wlan_drvDriver的唯一工作是定义DriverEntry。操作系统通过该函数得知驱动程序的入口。DriverEntry例化NetworkDriver Wizard生成的另外一个类wlan_drvAdapter,并将本驱动程序注册。
wlan_drvDriver类不用开发者干预。开发者需要关心的是另外一个类wlan_drvAdapter,它是KndisMiniAdapter的子类。
4 驱动程序的初始化
wlan_drvAdapter类的实现是整个驱动程序的主体部分,包括初始化驱动程序、发送数据、接收数据、中断处理、网卡复位等。
驱动程序在被装入操作系统后的第一步工作是进行初始化。该工作由wlan_drv Adapter::Initialize函数完成。该函数完成的工作如下:
(1)选择媒体类型。对于无线局域网为 NdisMedium802_3,而不是NdisMedium-WirelessWan。声明为 NdisMediumWirelessWan将支持各种无线媒体类型,NdisMedium802_3原本为以太网设计,这里无线局域网似乎应该声明为NdisMediumWirelessWan媒体类型,但事实并不是这样。通过查询OID_GEN_PHYSICAL_MEDIUM,协议驱动程序可以得知物理媒体为NdisPhysical-MediumWirelessLan类型。
(2)从注册表读取网卡地址。
(3)注册适配器的类型,如指定设备为 NdisInterfacePcMcia,代表网卡为PCMCIA标准的PC Card。这里需要强调的是PCMCIA接口的配置存储器和功能寄存器都是由主机自行维护的,虽然驱动程序也可以读写配置存储器和功能寄存器,但这样做会导致系统工作的不一致,除非特别需要,驱动程序无需读写配置存储器和功能寄存器。
(4)选择并注册IO端口。
(5)选择并注册中断。
(6)设定网卡所支持的包种类,如广播中的多播等。
(7)设定网卡的MAC属性
上一篇:CCD图像传感器