设备驱动(1)-驱动程序简介

linux驱动程序简介

       设备驱动是干什么用的?
       Linux设备驱动程序使得特定的硬件响应一个定义良好的内部编程接口(系统调用open、read、write、close),这些接口完全隐藏了设备的工作细节。使得用户通过调用标准的系统调用来完成对于硬件的操作。

驱动程序的分类

       字符设备是一种按字节顺序访问的设备,因此字符设备通常至少要实现open、read、write、close方法,字符设备可以通过文件系统节点来访问,字符设备文件与普通文件之间的唯一差别在于对普通文件的访问可以前后移动访问位置,而大多数字符设备是一个只能顺序访问。
       块设备同样可以通过/dev目录下的文件系统节点来访问,在大多数Unix系统中,块设备不能按字节处理数据,只能一次传送一个或多个长度是512个字节(或者一个更大的2次幂的数)的整块数据。而Linux则允许块设备传送任意字节。因此,块设备和字符设备的区别仅仅在于内核管理数据的方式,也就是内核与驱动程序之间的软件接口,而这些对于用户来说是透明的。
       网络设备:网络接口是由内核中的网络子系统驱动,负责发送和接收数据包,但是它不需要了解每项事务如何映射到实际传送的数据包。许多网络连接时面向流的,而网络设备却是围绕数据包的传输和接收而设计的,网络驱动程序不需要知道各个连接的相关信息,它只要处理数据包即可。由于网络设备驱动不是面向流的,因此将网络接口映射到文件系统中的节点比较困难,UNIX访问网络接口的方法仍然是给他们分配一个唯一的名字。但是这个名字在文件系统中不存在对应的节点,内核和网络设备驱动程序之间的通信,完全不同于内核和字符或者内核和块设备驱动程序之间的通信,内核调用一套和数据包传输相关的函数而不是read、write。
       字符设备和块设备的区别
       二者的区别如下:字符设备是不可以随机访问的,而块设备有存储位置的概念是可以随机访问指定位置上的数据,如果块设备的容量足够,就可以容纳一个文件系统,有了文件系统的块设备就可以被挂载,另外在Linux系统中块设备是可以按字节访问的,Linux中字符设备驱动和块设备驱动的区别就在于驱动与内核的接口不同。
       好的驱动程序包括一些典型的特征:1) 同时支持同步和异步操作、2) 驱动程序能够被多次打开、3)充分利用硬件特性、4)不包含用来简化任务或者提供策略相关的软件层
       linux下驱动程序的加载方式
       在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载。
       静态加载就是把驱动程序直接编译进内核,系统启动的时候可以直接加载。静态加载的缺点:1)调试起来比较麻烦,每次修改一个组件都要重新编译和下载内核,效率较低;2)把所有的组件都编译进内核文件,将导致生成的内核文件过大。
       动态加载利用了Linux的内核模块机制,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块,采用这种动态加载的方式便于驱动程序的调试,同时可以针对产品的功能需求,进行内核的裁剪,将不需要的驱动去除,大大减小了内核的存储容量。
       内核模块的特点

  • 模块本身并不被编译进内核文件(zimage或者uimage)
  • 可以根据需求,在内核运行期间动态的安装或者卸载
           
           注:出于安全考虑,我们同样可以将内核编译为不支持模块的方式,从而关闭任何模块相关的漏洞,但是在这种情况下,所有的驱动程序都必须预先编译进内核。在2.2及以后的内核版本中,我们还可以通过权能机制禁止在系统启动后装载内核模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值