当时第二章<构造和运行模块>部分也写了点笔记, 但是东西比较少, 就不放上来了.
这边直接开始第三章<字符设备驱动程序>的部分.
NOTE: "LDD读书笔记"系列所有内容均为个人原创, 转载请注明出处.
1. 什么是字符设备
•设备发送和接收数据以字符的形式进行
•对应概念
–块设备(以整个数据缓冲区的形式进行,可以对请求进行优化排序)
–通过命令
ls -l输出的头一个字母识别一个设备为何种设备。如果是'b'就是块设备,如果是'c'就是字符设备
2.主设备号和次设备号
•# ls -l /dev/hda[1-3]
•brw-rw---- 1 root disk 3, 1 Jul 5 2000 /dev/hda1
•brw-rw---- 1 root disk 3, 2 Jul 5 2000 /dev/hda2
•brw-rw---- 1 root disk 3, 3 Jul 5 2000 /dev/hda3
•主设备号决定使用何种设备驱动程序
•从设备号用来区别驱动程序控制的多个设备
3. 怎么得到设备号
3. 怎么得到设备号
•Dev_t类型描述, 12位表示主设备号, 20位表示从设备号
•MAJOR(dev_t dev)得到主设备号
•MINOR(dev_t dev)得到从设备号
•MKDEV(int major, int minor)转换为dev_t类型
- 释放设备编号
4. 分配和释放设备号
•Int register_chrdev_region(dev_t first, unsigned int count, char *name)
- 明确知道所需要的设备编号的情况下使用. count表示的是所请求的连续设备编号的个数
- 明确知道所需要的设备编号的情况下使用. count表示的是所请求的连续设备编号的个数
•Int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned intcount, char *name)
- 动态分配. 分配好的设备编号的第一个编号作为dev的输出返回值.
- 动态分配. 分配好的设备编号的第一个编号作为dev的输出返回值.
•Void unregister_chrdev_region(dev_t first, unsigned int count)
在/proc/devices文件中就可以看到设备的主设备号
- major 和 name 必须和注册的接口保持一致
5. 设备初始化和注册等操作
内核使用cdev结构体来表示字符设备, 在调用设备的 相关操作前, 需要往内核中注册cdev结构.
相关函数有
•struct cdev *cdev_alloc(void);
- 分配一个cdev 结构
内核使用cdev结构体来表示字符设备, 在调用设备的 相关操作前, 需要往内核中注册cdev结构.
相关函数有
•struct cdev *cdev_alloc(void);
- 分配一个cdev 结构
•void cdev_init(struct cdev *cdev, const structfile_operations *fops)
- 初始化一个cdev 的结构体, 并cdev->ops = fops
- 初始化一个cdev 的结构体, 并cdev->ops = fops
•int cdev_add(struct cdev *p, dev_t dev,unsigned count)
- 初始化完之后, 往系统中添加一个cdev
- 调用可能会失败
- 初始化完之后, 往系统中添加一个cdev
- 调用可能会失败
•void cdev_del(struct cdev *p)
- 从系统中移除一个字符设备
上面的接口是2.6后引进的, 老的版本中典型的注册方式是:
- 从系统中移除一个字符设备
上面的接口是2.6后引进的, 老的版本中典型的注册方式是:
•int register_chrdev(unsigned int major, const char *name, struct file_operations *fops)
- 给定主设备号的注册方式, 会保留0-255的共256个次设备号.
对应的, 移除设备的函数
•intunregister_chrdev(unsigned int major, const char *name)
- 给定主设备号的注册方式, 会保留0-255的共256个次设备号.
对应的, 移除设备的函数
6. 驱动程序操作涉及到的重要结构
•file_operation
- 对文件操作的函数指针结构体
- 对文件操作的函数指针结构体
•File
- 打开的文件描述符. 和用户空间程序中的FILE没有任何关联.
- 打开的文件描述符. 和用户空间程序中的FILE没有任何关联.
•inode
- 内核用inode表示文件, 可能会有多个File结构, 但是指向的是同一个inode.
- 内核用inode表示文件, 可能会有多个File结构, 但是指向的是同一个inode.