编写块设备
1.用户进程与块设备的联系
从我们打开文件开始即存在一个file结构体
struct file {
...
struct address_space *f_mapping;
...
};
file结构体中内嵌文件地址空间对象结构体address_space
struct address_space {
struct inode *host; /* owner: inode, block_device */
...
} __attribute__((aligned(sizeof(long))));
address_space结构体中内嵌块设备的inode结构体
struct inode {
...
struct block_device *i_bdev;
...
};
inode结构体中内嵌block_device块设备结构体
struct block_device {
...
struct gendisk * bd_disk;
...
};
block_device块设备结构体中内嵌gendisk磁盘描述符结构体
struct gendisk {
...
struct request_queue *queue;
...
};
gendisk磁盘描述符结构体内嵌请求队列request_queue
struct request_queue
{
...
struct list_head queue_head;
...
};
以上我们就可以清晰地看到用户进程是怎么和块设备产生联系的了。
2.block_device_operations操作方法集
struct block_device_operations {
int (*open) (struct block_device *, fmode_t);
int (*release) (struct gendisk *, fmode_t);
int (*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
int (*direct_access) (struct block_device *, sector_t,void **, unsigned long *);
int (*media_changed) (struct gendisk *);
int (*revalidate_disk) (struct gendisk *);
int (*getgeo)(struct block_device *, struct hd_geometry *);
struct module *owner;
};
block_device_operations描述磁盘的操作方法集,block_device_operations之于gendisk,类似于file_operations之于cdev。只不过在block_device_operations中并没有read和write方法,所有涉及块设备的I/O通常由系统进行缓冲处理,用户进程不会对这些设备执行直接的I/O操作。
磁盘描述符gendisk
struct gendisk {
/* major, first_minor and minors are input parameters only,
* don't use directly. Use disk_devt() and disk_max_parts().
*/
int major; /* major number of driver */ //主设备号
int first_minor;//次设备号,如果有分区,每个分区都需要一个次设备号
int minors; //次设备的最大数目,未分区则 = 1 /* maximum number of minors, =1 for
* disks that can't be partitioned. */
char disk_name[DISK_NAME_LEN]; /* name of major driver *///磁盘名字
char *(*devnode)(struct gendisk *gd, mode_t *mode);
unsigned int events; /* supported events */
unsigned int async_events; /* async events, subset of all */
/* Array of pointers to partitions indexed by partno.
* Protected with matching bdev lock but stat and other
* non-critical accesses use RCU. Always access through
* helpers.
*/
struct disk_part_tbl __rcu *part_tbl;
struct hd_struct part0;
const struct block_device_operations *fops;//块设备操作函数集合,类似字符设备驱动的file_operation结构体
struct request_queue *queue;//请求队列,用来管理该设备的I/O请求
void *private_data; //指向私有数据的指针
int flags;//描述驱动器状态的标志
struct device *driverfs_dev; // FIXME: remove
struct