LDD读书笔记备份_字符设备

当时第二章<构造和运行模块>部分也写了点笔记, 但是东西比较少, 就不放上来了.

这边直接开始第三章<字符设备驱动程序>的部分.


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. 怎么得到设备号
    •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表示的是所请求的连续设备编号的个数
    •Int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned intcount, char *name)
        - 动态分配. 分配好的设备编号的第一个编号作为dev的输出返回值.
    •Void unregister_chrdev_region(dev_t first, unsigned int count)
        - 释放设备编号
在/proc/devices文件中就可以看到设备的主设备号

5. 设备初始化和注册等操作
内核使用cdev结构体来表示字符设备, 在调用设备的 相关操作前, 需要往内核中注册cdev结构.
相关函数有
    •struct cdev *cdev_alloc(void);
        - 分配一个cdev 结构
    •void cdev_init(struct cdev *cdev, const structfile_operations *fops)
        - 初始化一个cdev 的结构体, 并cdev->ops = fops
    •int cdev_add(struct cdev *p, dev_t dev,unsigned count)
        - 初始化完之后, 往系统中添加一个cdev
        - 调用可能会失败
    •void cdev_del(struct cdev *p)
        - 从系统中移除一个字符设备

上面的接口是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)
        - major 和 name 必须和注册的接口保持一致

6. 驱动程序操作涉及到的重要结构
    •file_operation
        - 对文件操作的函数指针结构体
    •File
        - 打开的文件描述符. 和用户空间程序中的FILE没有任何关联.
    •inode
        - 内核用inode表示文件, 可能会有多个File结构, 但是指向的是同一个inode.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值