块设备之设备驱动层

  块设备是通过generic_make_request提交请求给I/O调度层,然后驱动层通过调用blk_init_queue来准备请求,这节来看看怎么样写一个块设备驱动程序。一个块设备的是由一个gendisk结构体来描述,每一个gendisk可以支持多个分区,内核对于块设备的访问,都是基于这个结构体展开

struct gendisk {
    int major;                                           //主设备号
    int first_minor;                                  //第一个次设备号
    int minors;                                             //次设备个数,每个分区都需要一个次设备号

    char disk_name[DISK_NAME_LEN];                           //块设备名字,可以通过/proc/partions获取
    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;                 //块设备操作集
    struct request_queue *queue;                          //请求队列
    void *private_data;                               //私有成员变量

    int flags;
    struct device *driverfs_dev;  // FIXME: remove
    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;
}

其实驱动就是构造这个结构体,并且提供一个驱动程序的访问队列即可。由通用层,如果驱动程序没有提供处理等待队列的处理函数,就会使用内核提供的默认的等待队列的处理函数,那么就分为两种情况,来看看怎么写一个块设备的驱动程序。

1. 对于没有提供等待队列的处理函数情况

  1. 分配一个请求队列:blk_alloc_queue

  2. 分配一个 gendisk 结构:alloc_disk

  3. 设置 gendisk 主要结构成员:置主次设备号,设置操作函数集,设置容量等

  4. 向内核注册块设备驱动:add_disk

2. 对于提供等待队列的处理函数的情况

  1. 分配一个请求队列:blk_alloc_queue

  2. 为请求队列绑定 make_request_fn 方法:blk_queue_make_request

  3. 分配一个 gendisk 结构:alloc_disk

  4. 设置 gendisk 主要结构成员:置主次设备号,设置操作函数集,设置容量等

  5. 向内核注册块设备驱动:add_disk

时间: 2024-10-24 22:20:32

块设备之设备驱动层的相关文章

设备驱动层

驱动层一般由硬件抽象层(HAL).板级支持包(BSP)和驱动程序组成,是嵌入式系统中不可或缺的重要部分.它的作用是为上层程序提供外部设备的操作接口,并且实现设备的驱动程序.上层程序可以不管操作的设备内部实现,只需要调用驱动的接口即可. 硬件抽象层(HAL) 嵌入式系统通常包含三个部分: 嵌入式应用程序 嵌入式操作系统 硬件平台 应用程序运行在操作系统之上,利用操作系统提供的接口完成特定功能.操作系统一般是RTOS,完成应用的任务调度和控制等核心功能.硬件平台根据应用的不同,所具备的功能各不相同,

RT-Thread的I/O设备模块及其驱动实现步骤

 一.I/O设备控制块 1.I/O设备控制块 struct rt_device { struct rt_object parent; /* 设备类型 */ enum rt_device_class_type type; /* 设备参数及打开参数 */ rt_uint16_t flag, open_flag; /* 提供给上层应用的回调函数 */ rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size); rt_err_t (*tx_co

JS 一些功能代码块[如判断设备]

判断是否为PC 来源:http://blog.csdn.net/seven1276/article/details/8211877 function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = new Array("Android", "iPhone", "SymbianOS", "Windows Phone", "iPad"

USB设备驱动之设备初始化(设备枚举)

USB设备从接入HUB到正常工作之前,都属于设备枚举阶段.所谓设备枚举,就是让host控制器认识USB设备,并为其准备资源,建立好主机与设备间的数据传递机制. 该阶段的工作,是USB通信协议规定的,所以属于ISO标准流程.设备枚举阶段也对应了USB设备的五种状态. 设备枚举阶段分为如下8个步骤: 获取设备描述符 复位 设置地址 再次获取设备描述符 获取配置描述符 获取接口,端点描述符 获取字符串描述符 选择设置配置 其中,步骤1与4都是获取设备描述符,两者有什么区别? 步骤1中只取得设备描述符的

MTP设备无法安装驱动的解决办法

1,进入设备管理器右击带黄色问号的MTP,选择“属性”,“详细信息”“设备范例 ID”(用Ctrl+C复制). 2,找到c:\windows\inf\wpdmtp.inf打开(或者通过运行打开),找到[Generic.NTx86]%GenericMTP.DeviceDesc%=MTP, USB\MS_COMP_MTP[Generic.NTamd64]%GenericMTP.DeviceDesc%=MTP, USB\MS_COMP_MTP 3,将2中的USB\MS_COMP_MTP更改为1中复制的

视频在线率统计——基于驱动总线设备的领域驱动设计方法落地

目录 视频在线率统计--基于驱动总线设备的领域驱动设计方法落地 1.应用背景 2.各视频在线率统计方法比较 3.本文侧重点 4.基于领域驱动来设计摄像头网络状态这一领域 4.1 值对象driverContext 4.2 子领域CameraPingDM 4.2.1 枚举类型摄像头网络状态CameraState 4.2.2 属性 4.2.3 子领域的划分 4.3 聚合CameraPingBus 4.3.1 属性 4.3.3 与CameraPingDM所有子领域相关的行为 4.3.4 领域模型字段在数

Minifilter微过滤框架:框架介绍以及驱动层和应用层的通讯

minifilter是sfilter后微软推出的过滤驱动框架.相比于sfilter,他更容易使用,需要程序员做的编码更简洁. 系统为minifilter专门制作了一个过滤管理器,这个管理器本身其实是一个传统过滤驱动,它向minifilter的使用者提供许多接口,让原本复杂的文件过滤驱动变得方便简单.之所以简单是因为传统的过滤驱动把大量的工作放在绑定设备上,而现在这些工作都交给minifilter中的过滤管理器来完成. 缺点:纯粹的使用minifilter提供的接口看不见设备对象和IRP的,所以编

14.linux-platform机制实现驱动层分离(详解)

版权声明:本文为博主原创文章,未经博主允许不得转载. 本节目标:        学习platform机制,如何实现驱动层分离 1.先来看看我们之前分析输入子系统的分层概念,如下图所示: 如上图所示,分层就是将一个复杂的工作分成了4层, 分而做之,降低难度,每一层专注于自己的事情, 系统只将其中的核心层和事件处理层写好了,所以我们只需要来写驱动层即可,接下来我们来分析platform机制以及分离概念 2.分离概念 优点: 将所有设备挂接到一个虚拟的总线上,方便sysfs节点和设备电源的管理 使得驱

DeviceIoControl 应用层如何和驱动层通信?

调用的方法之一的DeviceIoControl 驱动层提供设备名 例如filedisk 在驱动层 首先先是注册列表 用winObj查看 filedisk的驱动对象 但是 这八个对象时怎么生成的呢? 我们在加载filedisk.sys驱动时进行中断 查看过程 具体的双击调试 看我的另一篇文章 http://www.cnblogs.com/UnMovedMover/p/3690369.html 在下载的源码filedisk中sys下面的filedisk-17\filedisk-17\sys\src