Linux块设备驱动(1)---块驱动中相关的结构体及其操作

本文详细介绍了Linux块设备驱动的相关概念,包括块设备与字符设备的区别、block_device_operations结构体及其操作、gendisk结构体的使用、请求request和bio结构体的作用,以及块设备驱动的注册与注销。内容深入浅出,适合对Linux内核驱动感兴趣的读者。
摘要由CSDN通过智能技术生成

 

 

1.字符设备与块设备IO操做的区别

 

1)块设备只能以块为单位接收输入返回输出,而字符设备则以byte为单位.大多数设备是字符设备,他们不需要缓冲并且不以固定块大小进行操作.

2)块设备对于IO请求有对应的缓冲区,所以他们可以选择以什么顺序进行响应.字符设备无须缓冲且被直接读写.

3)字符设备只能被顺序读写,块设备可以随机访问.

 

 

2.block_device_operations结构体

block_device_operations描述了对块设备的操作的集合

    struct block_device_operations {

        int (*open) (struct inode *, struct file *);/*打开*/

        int (*release) (struct inode *, struct file *);/*释放*/

        int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long);

        long (*unlocked_ioctl) (struct file *, unsigned, unsigned long);

        long (*compat_ioctl) (struct file *, unsigned, unsigned long);

        int (*direct_access) (struct block_device *, sector_t, unsigned long *);

        int (*media_changed) (struct gendisk *);/*介质被改变?*/

        int (*revalidate_disk) (struct gendisk *);/*使介质改变*/

        int (*getgeo)(struct block_device *, struct hd_geometry *);/*填充驱动器信息*/

        struct module *owner;/*模块拥有者,一般初始化为THIS_MODULE*/

    };

关于block_device_operations的操作:

    //open and release

    int (* open)(struct inode*, struct file*);

    int (* release)(struct inode*, struct file*);

    //io contrl

    //系统调用实现,块设备包含大量的标准请求,由设备层处理,所以此函数一般相当短

    int (* ioctl)(struct inode*,struct file*,unsigned int,unsigned long);

    //media changed

    //如果改变返回非0值,否则返回0

    int (*media_changed)(struct gendisk*);

    //revalidate media

    //用于响应一个介质的改变,给驱动一个机会做准备工作

    int (* revalidate_disk)(struct gendisk*);

    //get driver informaiton

    //根据驱动器的几何信息填充hd_geometry,包含磁头,柱面,扇区等信息.

    int (* getgeo)(struct block_device*, struct hd_geometry*);

 

 

 

3.gendisk结构体

 

 

使用gendisk结果提来描述一个独立的磁盘设备或分区.

    //gendisk structure

    struct gendisk{

        /*前三个元素共同表征了一个磁盘的主,次设备号,同一个磁盘的各个分区共享一个主设备号*/

        int major;/*主设备号*/

        int first_minor;/*第一个次设备号*/

        int minors;/*最大的次设备数,如果不能分区,则为1*/

        char disk_name[32];

        struct hd_struct** part;/*磁盘上的分区信息*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值