大部分设备驱动程序倾向于工作在拥有特权的内核模式。但是有些无所谓的,如SCSI,USB,I2C等内核子系统在一定程序上支持用户模式驱动程序,可以不写就可以控制这些设备。
从用户空间驱动
1.访问IO区域
linux上用户访问IO端口受到两个函数控制
ioperm()
iopl()
2. 访问内存区域
对于一个文件进行内存映射(mmaping )将使它与用户空间的一段虚拟内存区域相关联。因为linux把设备当作文件。可以将设备内存映射到RAM,然后从用户空间直接操作它。
mmap()
1.图形用户接口,将视频内存做内存映射,并直接访问图形硬件。
2.madplay是MP3播放器,可运行在几个系统上。
3.MPEG解码器通过直接操作映射缓冲播放视频。
4.用户模式SCSI
有了SG接口可以从用户空间直接发送SCSI命令。sg驱动程序输出一个字符接口。可以用open(),close(),read(),write(),ioctl(),poll(),fcntl(),mmap()系统调用与底层设备通信。
5.用户USB模式
usbfs 虚拟文件系统从用户空间以原始的方式访问USB设备。usbfs挂载/proc/bus/usb/上。
6.用户I2C模式
如果需要支持大量低速I2C设备,从用户空间驱动有意义。i
i2c-dev模块有助于开发用户模式I2C/smbus设备驱动程序。用户空间代码能通过设备节点访问I2C主机适配器。
数据结构
sched_param /usr/include/bits/sched.h
usb_dev_handle libusb包中的头文件 从用户空间操作USB设备的结构体
用户空间函数
iopl() 控制所有IO端口的访问权限
usb open()
msync 写回对比映射的内存区域的改动
mmap() 将一个文件或一个设备地址区域或一块用户空间虚拟内存绑定。