设备驱动简介
设备被大概的分为两类: 字符设备和块设备。
字符设备
提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,键盘、串口、调制解调器都是典型的字符设备。块设备
应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘、软盘、CD-ROM驱动器和闪存都是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。
这两种类型的设备的根本区别在于它们是否可以被随机访问。字符设备只能顺序读取,块设备可以随机读取。其它的一些区别:
- 字符设备只能以字节为最小单位访问,而块设备以块为单位访问,例如512字节,1024字节等
- 块设备可以随机访问,但是字符设备不可以
- 字符和块没有访问量大小的限制,块也可以以字节为单位来访问
对于设备来说,linux抽象为一个个文件,放在/dev目录下,每个文件都有一定的属性其中比较重要的有主设备号和次设备号两个。主设备号标明了设备的类型,次设备号表示同类型设备的不同设备
[root@localhost blog]# ls -al /dev/sda
brw-rw----. 1 root disk 8, 0 Apr 22 22:49 /dev/sda
8是主设备号表示这是一个磁盘,0是次设备号区别相同类型设备的不同设备
开始编写字符设备驱动
注册和撤销设备
通过注册设备驱动模块,可以将一组操作设备的函数和某一设备进行关联起来。
注册一个设备:
linux/fs.h 中的函数 register_chrdev
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
其中major是主设备号,name是设备的名字,fops则是该设备对应的一些列操作函数,成功返回主设备号
major如果为0的话,系统会给我们随机分配主设备号
问题是主设备号怎么去定义,难道可以自己随便填吗?如果大家都这样,那么设备好像就乱了要申请一个没有使用的设备号可以去查看文档:D