一. 知识点
1. 设备号;
2. 创建设备文件;
3. 设备注册;
4. 重要数据结构;
5. 设备操作;
二.主设备号
字符设备通过字符设备文件来存取。字符设备文件由使用ls -l 的输出的第一列的”C”标识;
如果使用ls –l 命令,会看到在设备文件项中有2个数(由一个逗号分隔)这些数字就是设备文件的主次设备编
举例:
crw-rw---- 1 root uucp 4, 66 04-18 21:59 ttyS2
crw-rw---- 1 root uucp 4, 67 04-18 21:59 ttyS3
crw-rw-rw- 1 root root 1, 9 04-18 22:00 urandom
crw-rw---- 1 root root 249, 0 04-18 22:00 usbdev1.1_ep00
crw-rw---- 1 root root 249, 1 04-18 22:00 usbdev1.1_ep81
crw-rw---- 1 root root 249, 2 04-18 22:00 usbdev2.1_ep00
crw-rw---- 1 root root 249, 3 04-18 22:00 usbdev2.1_ep81
crw-rw---- 1 root root 251, 0 04-18 22:00 usbmon0
crw-rw---- 1 root root 251, 1 04-18 22:00 usbmon1
crw-rw---- 1 root root 251, 2 04-18 22:00 usbmon2
crw-rw---- 1 vcsa tty 7, 0 04-18 22:00 vcs
crw-rw---- 1 vcsa tty 7, 1 04-18 22:00 vcs1
crw-rw---- 1 vcsa tty 7, 2 04-18 22:00 vcs2
crw-rw---- 1 vcsa tty 7, 3 04-18 22:00 vcs3
crw-rw---- 1 vcsa tty 7, 4 04-18 22:00 vcs4
设备号
设备号用来做什么??
设备号的作用
1>.主设备号用来标识与设备文件相连的驱动程序。
次设备号被驱动程序用来辨别操作的是哪个设备。
*****主设备号用来反映设备类型******
***次设备号用来区分同类型的哪一个设备***
三.主次设备号
Q:内核中如何描述设备号?
A:dev_t
*****其实质为unsigned int 32位整数,其中高12位为主设备号,低20位为次设备号。
Q:如何从dev_t中分解出主设备号?
A:MAJOR(dev_t dev)
Q:如何从dev_t只分解出次设备号?
A:MINOR(dev_t dev)
四.分配主设备号
Linux 内核如何给设备分配主设备号?
可以采用静态申请,动态分配两种方法
(动态、静态是针对主设备号来说的)
静态申请
int register_chrdev_region(dev_t from ,unsigned count ,const char *name)
功能:申请使用从from开始的count 个设备号(主设备号不变,次设备号增加)
参数:
From :希望申请使用的设备号数目
Count :希望申请使用的设备号数目
Name :设备名(体现在/proc/devices)
动态分配
方法:
使用alloc_chrdev_region分配设备号
优点:简单,易于驱动推广
缺点:无法在安装驱动前创建设备文件(因为安装前还没分配到主设备号。)
解决办法:
安装驱动后,从/proc/devices中查询设备号
动态分配
Int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
功能:动态申请count个设备号,第1个设备号的次设备号为baseminor.
参数:
Dev:分配到的设备号
Baseminor :起始次设备号
Count :要注册的设备号个数
Name :设备名(体现在/proc/devices)
主设备号是动态产生的,次设备号(的第一个)是要指定的;
五.注销设备号
不论使用何种方法分配设备号,都应该在不再使用它们的时候释放这些设备号。
Void unregister_chrdev_region(dev_t from, unsigned count)
功能:
释放从from 开始的count个设备号
六.创建设备文件
两种方法:1.使用mknod命令手工创建;
2.自动创建
手工创建:
mknod用法:
mknod filename type major minor
filename :设备文件名
type: 设备文件类型
major:主设备号
minor :次设备号
例如:mknod serial0 c 100 0
之后 ls serial0 命令可查
不要0也可以,通过0知道是第几个设备
七.重要结构
在Linux 字符设备驱动程序设计中,有3种非常重要的数据结构:
1. struct file
2. struct inode
3. struct file_operations
Stuct file
代表一个开打的文件。系统中每一个打开的文件在内核空间都有一个关联的struct file . 它由内核在打开文件时创建,在文件关闭后释放。
(一个文件被打开一次对应一个Struct file,这个文件同时被打开10次,则对应10个Struct file)
***重要成员
Loff_t f_pos /*文件读写位置*/
Struct file_operations *f_op
struct inode
用来记录文件的物理上的信息。因此,他和代表打开文件的file结构是不同的。
一个文件可以对应多个file结构,但只有一个inode结构。
转载于:https://blog.51cto.com/yumsun/1690558