块设备(Block Device)是指在操作系统中以固定大小的块为单位进行数据读写的设备。每个块的大小通常为512字节或更大,用于存储和传输数据。块设备可以是硬盘、固态硬盘(SSD)、光盘、闪存等存储设备
特点:
固定大小的块:块设备以固定大小的块为单位进行读写操作
有缓冲区:块设备通常具有内部缓冲区,数据会先缓存在内存中,然后批量传输到设备或从设备中读取。这样可以提高数据读写的效率,减少对设备的频繁访问
支持随机访问:可以按照块的地址直接读写特定的数据块
文件系统中的块设备:在操作系统中,块设备通常作为硬盘或其他存储设备的一部分存在。它们通过文件系统进行管理和访问。操作系统将块设备分成固定大小的块,并使用文件系统来组织和管理这些块
gendisk结构体在Linux内核中表示一个块设备,是块设备驱动程序和块设备层之间的接口数据结构
struct gendisk {
int major; //块设备主设备号
int first_minor; //起始的从设备号,通常=0
int minors; //从设备号数量,块设备分区数为minors-1,1=不分区
char disk_name[DISK_NAME_LEN]; //块设备的名字
unsigned short events; //支持的事件
unsigned short event_flags; //异步事件
struct disk_part_tbl __rcu *part_tbl; //块设备分区表首地址,用来串起各个hd_struct分区
struct hd_struct part0; //表示分区的结构体,此处part0记录了整个块设备的信息
const struct block_device_operations *fops; //块设备操作方法结构体
struct request_queue *queue; //请求队列的指针
void *private_data; //私有数据,为驱动程序传参
int flags; //用来表示驱动器状态的标志
unsigned long state;
#define GD_NEED_PART_SCAN 0
struct rw_semaphore lookup_sem;
struct kobject *slave_dir; //表示gendisk的device实例的父设备
struct timer_rand_state *random;
atomic_t sync_io; /* RAID */
struct disk_events *ev; //块设备事件结构体指针
#ifdef CONFIG_BLK_DEV_INTEGRITY
struct kobject integrity_kobj;
#endif /* CONFIG_BLK_DEV_INTEGRITY */
#if IS_ENABLED(CONFIG_CDROM)
struct cdrom_device_info *cdi;
#endif
int node_id; //块设备关联的内存节点编号
struct badblocks *bb;
struct lockdep_map lockdep_map;
};
分区表disk_part_tbl结构体,用来串起各个hd_struct分区,定义在include/linux/genhd.h
struct disk_part_tbl {
struct rcu_head rcu_head;
int len; //分区结构体指针数组的项数
struct hd_struct __rcu *last_lookup; //上次查找的分区结构体
struct hd_struct __rcu *part[]; //分区结构体指针数组
};
hd_struct结构体表示块设备的某一个分区的信息,如磁盘容量等。定