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;/*引用计数*/
.....................
};