博舍

字符设备驱动与块设备驱动、网络设备驱动的区别 智能接口包含什么设备和设备类型的区别

字符设备驱动与块设备驱动、网络设备驱动的区别

在Linux操作系统下有3类主要的设备文件类型:块设备、字符设备和网络设备。这种分类方法可以将控制输入/输出设备的驱动程序与其他操作系统软件分离开来。字符设备是指存取时没有缓存的设备。典型的字符设备包括鼠标、键盘、串行口等。字符设备与块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般紧接着发生。块设备则不然,它利用一块系统内存作为缓冲区,若用户进程对设备的请求能满足用户的要求,就返回请求的数据;否则,就调用请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,以免耗费过多的CPU时间用来等待。网络设备可以通过BSD套接口访问数据。一.主设备号和次设备号主设备号标识设备对应的驱动程序;次设备号由内核使用,用于正确确定设备文件所指的设备。我们可以通过次设备号获得一个指向内核设备的直接指针,也可将次设备号当作设备本地数组的索引,不管用哪种方式,除了知道次设备号用来指向驱动程序所实现的设备之外,内核本身基本上不关心关于次设备号的任何其他消息。◎设备编号的内部表达内核用dev_t类型()来保存设备编号,dev_t是一个32位的数,12位表示主设备号,20位表示次设备号。在实际使用中,是通过中定义的宏来转换格式。 (dev_t)-->主设备号、次设备号       MAJOR(dev_tdev)     MINOR(dev_tdev) 主设备号、次设备号-->(dev_t)       MKDEV(intmajor,intminor) ◎分配和释放设备编号建立一个字符设备之前,驱动程序首先要做的事情就是获得设备编号。其这主要函数在中声明:intregister_chrdev_region(dev_tfirst,unsignedintcount,char*name);   //指定设备编号intalloc_chrdev_region(dev_t*dev,unsignedintfirstminor,unsignedintcount,char*name);  //动态生成设备编号voidunregister_chrdev_region(dev_tfirst,unsignedintcount);      //释放设备编号 分配之设备号的最佳方式是:默认采用动态分配,同时保留在加载甚至是编译时指定主设备号的余地。◎动态分配主设备号

    某些主设备号已经静态地分配给了大部分公用设备。在内核源码树的Documentation/device.txt......

 

可以讲字符设备和块设备归为一类,它们都是可以顺序/随机地进行读取和存储的单元,二者驱动主要在于块设备需要具体的burst实现,对访问也有一定的边界要求。其他的没有什么不同。网络设备是特殊设备的驱动,它负责接收和发送帧数据,可能是物理帧,也可能是ip数据包,这些特性都有网络驱动决定。它并不存在于/dev下面,所以与一般的设备不同。网络设备是一个net_device结构,并通过register_netdev注册到系统里,最后通过ifconfig-a的命令就能看到。不论是什么设备,设备级的数据传输都是基本类似的,内核里的数据表示只是一部分,更重要的是总线的访问,例如串行spi,i2c,并行dma等。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇