Linux驱动开发之块设备初入门(2)

endisk中包含一个kobject成员, 它是一个可被引用计数的结构体。通过get_disk()和put_disk()函数可用来操作引用计数。驱动通常不需要做这个。
    struct kobject *get_disk(struct gendisk *disk);
    void put_disk(struct gendisk *disk);

void add_disk(struct gendisk *gd);
    对gendisk初始化之后还不能使用和这个设备,应该使用add_disk注册磁盘设备

static inline void set_capacity(struct gendisk *disk, sector_t size)
    设置gendisk容量,块设备中最小单位是扇区,扇区的大小一般是2的整数倍,最常见的大小是512kb (xx>>9)表示/512 (xx<<9)表示*512。扇区大小是物理设备所决定的。
 

5、block_device_operationse结构体
    类似与字符设备驱动程序中的file_operations结构,该集合用于控制设备的操作,但是在大多数情况下都是以mount的方式进行访问,用户程序一般不会直接访问块设备中的文件。需要包含<linux/blkdev.h>头文件。
    struct block_device_operations {
        /*打开这个设备时候调用*/
        int (*open) (struct inode *, struct file *);
       
        /*关闭/释放 时候调用*/
        int (*release) (struct inode *, struct file *);
       
        /*ioctl()系统调用的实现,块设备包含大量的标准请求,这些标准请求由 Linux 块设备层处理,因此大部分块设备驱动的*/
        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 *);
       
        /*内核周期调用检查驱动器介质有没有发生改变,改变返回非0,没有改变返回0。用于支持可移动设备,非可以移动设备不用实现*/
        int (*media_changed) (struct gendisk *);
       
        /*被调用响应介质被改变,驱动进行必要的工作*/
        int (*revalidate_disk) (struct gendisk *);
       
        /*根据驱动器的几何信息填充hd_geometry,包含磁头,柱面,扇区等信息.*/
        int (*getgeo)(struct block_device *, struct hd_geometry *);
       
        /*模块拥有者,一般初始化为THIS_MODULE*/
        struct module *owner;
    };
    block_device_operations 结构中没有实际读或写数据的函数,在块 I/O 子系统中,这些操作由请求函数处理。

6、request 和 bio 结构体

struct request {
        struct list_head queuelist;/*请求链表*/
        struct list_head donelist;
        request_queue_t *q;          /*请求所属队列*/
        unsigned int cmd_flags;
        enum rq_cmd_type_bits cmd_type;
        sector_t sector;        /* 当前扇区 */
        sector_t hard_sector;    /*要传输的下一个扇区*/
        unsigned long nr_sectors;/* 要传输的扇区数目*/
        unsigned long hard_nr_sectors;  /*要被完成扇区的数目 */
        unsigned int current_nr_sectors;/*当前传送的扇区*/
        unsigned int hard_cur_sectors;  /*当前要被完成的扇区数目*/
        struct bio *bio;    /*请求的block i/o(bio)结构体链表首 request请求 第一个bio*/
        struct bio *biotail;/*请求的bio结构体链表尾 request请求 最后个bio*/
        char *buffer; /*request请求中断 第一个bio*/
        int ref_count;/*引用计数*/
        .....................
    };

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1113f82fc69a591afa0531884adb3059.html