块设备基础 >>Linux设备驱动程序

因为专注所以专业是很重要的事情,再还没有把事情做到极致的时候,请不要在人前炫耀,那样就会恐惧就会紧张无助;
多么花哨的表演都是源于基础的执着,尽可能知其然必知其所以然;

[0x100] 概念与特征

  1. 数据形成固定大小的数据块,以块大小为单位进行随机范围的数据访问;
  2. Linux内核扇区大小是 512 Btye,因此扇区编号 [存储空间字节数/512] 的结果;
  3. 根据不同系统架构,数据块大小不同,通常 4096 字节 也就是4KBtye;

[0x110]块设备属性信息

  1. 描述块设备的属性信息,包括设备标识,分区标识;
  2. IO请求事件管理;
  3. 块设备管理回调函数;

[0x120] 请求队列

[0x122] 作用

  • 保存块设备的I/O请求的队列
  • 需要块设备处理的请求参数:独立段数目、硬件扇区大小、对齐方式 等等;
  • 最终期限I/O调度器:在确保效率的情况下,保证所有请求不会被超期执行;
  • 预计I/O调度器:阻止了短间隔内相同类型块设备请求操作;

[0x122] 内容

  1. 设备参数:厂商ID、产品型号、容量、可用大小、诊断信息等等
  2. 读写IO请求
  3. 控制命令:记录介质写模式设定、切换磁道、返回审计报告等等;

[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 
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值