浅谈usb的枚举过程及Ndis驱动的分层结构

一家大型企业技术面试题如下:

叙述usb 枚举过程?

(1)当系统重启,硬件介入或添加新设备时,会进行usb设备枚举
(2)然后总线驱动程序检测到新的usb硬件;根据usb设备描述符合usb配置描述符,获取厂商

(VID,PID),设备类型,版本等信息;
(3)根据这些信息,Pnp管理器创建物理驱动对象(PDO),并在注册表中添加某些信息;
(4)Pnp管理器查找注册表中与该PDO一致的各级驱动程序;
4.1)如果没有找到,则读.inf文件,按照.inf文件安装驱动程序;
4.2)如果已经安装了驱动程序,那么就会找到驱动程序,这里用的SetupApi库;
(5)Pnp管理器查找所选驱动程序对象是否已经在I/O管理器中?
5.1)如果没有,那么就必须执行DriverEntry()函数将对象指针装入I/O管理器;
(6)Pnp管理器装入最底层过滤驱动程序,调用AddDevice函数,实现Fido与同级驱动程序的连接

;同时AddDevice函数把PDO连接到FiDO;
(7)Pnp管理器依次装入各级驱动程序,完成整个设备对象栈;
(8)Pnp向usb设备发送各种pnp IRP,实现usb主机和usb设备之间的通信;

在开发usb设备驱动程序时,usb设备和usb主机是怎样通信的?换句话说,讲讲你在做usb驱动程

序的时候是怎么架构的?

(1)PC机和usb设备通过usb驱动程序进行通信,根据usb协议,无论是采用bulk传输,中断传输或

者是同步传输,可以这么考虑,首先在内核中开辟一个缓冲区,通过这个缓冲区,将usb设备传

出的数据copy到用户应用程序的缓冲区中。这里主要包括2点。
1.1)pc机向usb设备发送控制命令,其实就是一个握手的协议,这个协议根据软件工程师和硬件

工程师共同商量决定,这样的好处是,软件工程师不要管硬件那边怎么配置寄存器,而硬件工程

师主要是做FPGA里面的程序,如果没有FPGA,采用ARM的话,那么所有的工作都是软件工程师的

事情了,硬件工程师只管原理图和PCB图,保证硬件没有问题,就ok了。
1.2)硬件收到PC端的控制命令后,就根据控制命令来传输相应的数据了,这样驱动程序就从usb

的端点读取数据,然后拷贝到内核缓冲区中,然后从应用程序采用ReadFile把数据读走。

usb 每次插入硬件都必须枚举设备吗?换一个usb口是否还要装usb驱动程序?

  usb每次插入都会枚举设备,换一个usb口也有可能需要安装usb驱动程序的,根据usb设备描述符

中serial number来确定;

Ndis 驱动分层架构:
Ndis主要包括Ndis协议驱动,Ndis中间层过滤驱动,和MiniPort小端口驱动;
其中Ndis协议驱动可以用来接收和发送数据包,winpcap就是一个Ndis协议驱动,而Ndis中间层

驱动主要用来做杀毒软件和防火墙使用;还小端口驱动就是我们通常指的网卡驱动。

Pc端通过Ndis驱动程序和硬件通信的过程是怎么样的?

(1)首先必须绑定网卡,绑定完网卡后,经过网卡的数据都会传给应用程序,同时通过应用程序也可

以将数据传给 硬件设备,比如网络相机等.
(2)然后根据通信协议,pc端控制网络设备,比如给网络设备发送控制命令,同时接收网络设备传送

过来的数据.

你可能感兴趣的:(工作,网络,面试,防火墙,杀毒软件)