理解块设备驱动、通用块层、IO调度层的关系和试验

编写块设备1.用户进程与块设备的联系从我们打开文件开始即存在一个file结构体struct file { ... struct address_space *f_mapping; ...};file结构体中内嵌文件地址空间对象结构体address_spacestruct address_space { struct inode *host; /* owner: inode, block_device */ ...} __attribute__((aligned(sizeof(l
摘要由CSDN通过智能技术生成

编写块设备

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 
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值