因为专注所以专业是很重要的事情,再还没有把事情做到极致的时候,请不要在人前炫耀,那样就会恐惧就会紧张无助;
多么花哨的表演都是源于基础的执着,尽可能知其然必知其所以然;
[0x100] 概念与特征
- 数据形成固定大小的数据块,以块大小为单位进行随机范围的数据访问;
- Linux内核扇区大小是 512 Btye,因此扇区编号 [存储空间字节数/512] 的结果;
- 根据不同系统架构,数据块大小不同,通常 4096 字节 也就是4KBtye;
[0x110]块设备属性信息
- 描述块设备的属性信息,包括设备标识,分区标识;
- IO请求事件管理;
- 块设备管理回调函数;
[0x120] 请求队列
[0x122] 作用
- 保存块设备的I/O请求的队列
- 需要块设备处理的请求参数:独立段数目、硬件扇区大小、对齐方式 等等;
- 最终期限I/O调度器:在确保效率的情况下,保证所有请求不会被超期执行;
- 预计I/O调度器:阻止了短间隔内相同类型块设备请求操作;
[0x122] 内容
- 设备参数:厂商ID、产品型号、容量、可用大小、诊断信息等等
- 读写IO请求
- 控制命令:记录介质写模式设定、切换磁道、返回审计报告等等;
[0x200] 相关数据结构
[0x210] 设备号链表结构[struct blk_major_name]
#include <linux/fs.h>
static struct blk_major_name {
struct blk_major_name *next; //链表下一条指针
int major; //主设备号
char name[16]; //设备名称
} *major_names[BLKDEV_MAJOR_HASH_SIZE];
[0x220] 块设备管理
[0x221] 块设备操作回调函数集
#include <linux/blkdev.h>
struct block_device_operations {
int (*open) (struct block_device *, fmode_t);
int (*release) (struct gendisk *, fmode_t);
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 *);
unsigned int (*check_events) (struct gendisk *disk,unsigned int clearing);
int (*media_changed) (struct gendisk *);
void (*unlock_native_capacity) (struct gendisk *);
int (*revalidate_disk) (struct gendisk *);
int (*getgeo)(struct block_device *, struct hd_geometry *);
/* this callback is with swap_lock and sometimes page table lock held */
void (*swap_slot_free_notify) (struct block_device *, unsigned long);
struct module *owner;
};
[0x222] 分区属性信息结构
#include <linux/genhd.h>
struct gendisk {
/*【只写参数】驱动程序主设备号 通常使用disk_devt()*/
int major;
/*【只写参数】第一个可用次设备号*/
int first_minor;
/*【只写参数】次设备号数量=1,磁盘不能分区;US=16,即分15个区,通常使用disk_max_parts()处理*/
int minors;
/* 主驱动器的标识,显示/proc/partions和sysfs中 */
char disk_name[DISK_NAME_LEN];
char *(*devnode)(struct gendisk *gd, umode_t *mode);
unsigned int events; /* supported events */
unsigned int async_events; /* async events, subset of all */
struct disk_part_tbl __rcu *part_tbl;
struct hd_struct part0;
/*块设备管理回调函数集*/
const struct block_device_operations *fops;
/*块设备I/O请求队列*/
struct request_queue *queue;
/*块设备驱动私有数据指针*/
void *private_data;
/*块设备的驱动器类型 GENHD_FL_* */
int flags;
struct device *driverfs_dev; // FIXME: remove
/*sysfs 对象*/
struct kobject *slave_dir;
struct timer_rand_state *random;
atomic_t sync_io; /* RAID */
struct disk_events *ev;
#ifdef CONFIG_BLK_DEV_INTEGRITY
struct blk_integrity *integrity;
#endif
int node_id;
};
[0x230] 块设备请求结构
[0x231] 请求项结构[struct request]
struct request {
struct list_head queuelist; /*链表维护连接多个request结构*/
struct call_single_data csd;
struct request_queue *q; /*请求队列的入口绑定*/
unsigned int cmd_flags;
enum rq_cmd_type_bits cmd_type;
unsigned long atomic_flags;
int cpu;
struct bio