【Linux 驱动】第一章 设备驱动程序简介
一,设备驱动程序的作用
最显著的作用,是可以使计算机和设备通信,充当硬件的接口。操作系统只能通过这个接口来控制设备。
二是书中说的驱动在于提供机制,而不是策略,个人觉得这应该是我们编写驱动程序遵循的一个原则。机制--需要提供什么功能,策略--如何使用这些功能。由于不同的环境需要不同的方式来使用硬件,因此应尽可能做到让驱动程序不带策略
驱动程序在用户态和内核态之间传递数据
驱动程序是内核的一部分,可以使用中断、DMA等操作
二,内核功能划分
进程管理:创建和销毁进程,处理他们与外部世界之间的连接
内存管理:在有限的可用资源之上为每个进车功能创建一个虚拟地址空间
文件系统:
设备控制:所有设备控制操作都由与控制设备相关的代码完成
网络功能
上面内核的每一部分都和我们编写具体的驱动程序相关,以后再学习中会慢慢涉及到每一部分。
三,可装载模块
linux提供了模块机制以便我们进行驱动开发。
insmod:将模块连接到正在运行的内核
rmmod :移除连接
四,设备和模块的分类
linux设备分类一般分为三类:字符设备,块设备,网络接口。
1)字符设备:所有能够象字节流一样访问的设备都通过字符设备实现它们被映射为文件系统中的节点,通常在/dev/目录下
2)块设备:通常是指诸如磁盘、内存、Flash等可以容纳文件系统的存储设备块设备也是通过文件系统访问,与字符设备的区别:内核管理数据的方式不同它允许象字符设备一样以字节流的方式来访问,也可一次传递任意多的字节。
3)网络接口设备:通常它指的是硬件设备,但有时也可能是一个软件设备(如回环接loopback),它们由内核中网络子系统驱动,负责发送和接收数据包。它们的数据传送往往不是面向流的,因此很难将它们映射到一个文件系统的节点上。
一般要包含open read write close等系统调用的实现
但是我们要知道一个复杂设备可能会涉及到linux驱动的很多子系统,比如usb的蓝牙键盘,会涉及到usb子系统,蓝牙协议栈,input子系统,所以这个设备从不同的角度看在linux内核中属于不同的子系统,所以这三个分类只是一个很简单概括的分类,我们也不必遵循这三个分类。
五,安全问题 & 版本编号 & 许可证条款
1) 主要是:缓存区溢出,数据泄漏,后门程序等等安全问题
2)内核版本编号,一般偶数版本的编号是正式发行的稳定版本,而奇数编号的版本是出于开发期的版本,然后书中提到:遇到任何版本相关问题,可以查看Documentation/Changes文件,于是我用友善提供的2.6.29内核看了下该文件,都是一些utils的使用以及编译本版本内核需要的一系列工具的版本要求以及下载链接。所以当内核编译出错可以从该文件看看。
3)许可证条款,这个问题大概就是说我们写的内核模块应该遵行GPL2发布,这样的话内核开发者就会知道我们写的内核模块的源码,这样如果内核代码在更新的时候不至于我们写的内核模块出现内核版本间不兼容的情况,所以我们都最好以GPL2这种许可证发布。
并且该许可证原文可以从内核顶层目录的COPYING文件查看到。
相关阅读: