34.驱动--块设备驱动
Linux块设备IO子系统(一) _驱动模型 - Abnor - 博客园
22.Linux-块设备驱动之框架详细分析(详解) - 诺谦 - 博客园
23.Linux-块设备驱动(详解) - 诺谦 - 博客园
Linux块设备驱动(一)gendisk结构体_wlli1985的博客-CSDN博客_gendisk结构体
gendisk,request与bio结构体;以及块设备驱动注册与注销,以及加载与卸载_guogaofeng1219的专栏-CSDN博客
块设备注册 register_blkdev_少想多做-CSDN博客_register_blkdev
写写加深印象。块设备跟字符设备不同,块设备是按扇区大小来读写数据的, 可以随机读写设备的任意位置处的数据.
- 段(Segments):由若干个块组成。是Linux内存管理机制中一个内存页或者内存页的一部分。
- 块 (Blocks): 由Linux制定对内核或文件系统等数据处理的基本单位。通常由1个或多个扇区组成。(对Linux操作系统而言)
- 扇区(Sectors):块设备的基本单位。通常在512字节到32768字节之间,默认512字节
块设备驱动的框架不想写了。知道块设备会使用电梯算法对读写进行优化就好,把”读写“放入队列,调用队列处理函数把位置靠近的数据合并,数据的读写顺序进行调整(统一先写或者先读),从而提高效率。
注册一个块设备驱动,需要以下步骤:
- 创建一个块设备
- 分配一个申请队列
- 分配一个gendisk结构体
- 设置gendisk结构体的成员
- 注册gendisk结构体
第一步:创建块设备
使用register_blkdev(unsigned int major, const char *name) 来创建,第一个参数是主设备号,如果写0,则内核自动分配,第二个参数是设备名称,名字不重要。
注册后,可以在/proc/devices下看到(cat /proc/device)。
第二步:分配gendisk结构体
内核使用gendisk(通用磁盘)结构来表示一个独立的磁盘设备。实际上内核还使用gendisk表示分区。gendisk结构体存储该设备的硬盘信息,包括请求队列、分区链表和块设备操作函数集等。
minors 参数是这个磁盘使用的次设备号的数量,一般也就是磁盘分区的数量,此后minors不能被修改。
第三步:对gendisk结构体进行设置
1)分配队列
使用blk_init_queue()分配+初始化+绑定一个有IO调度的gendisk的requst_queue,并赋予gendisk结构体。
第一个参数是电梯调度算法的函数,需要用户完善,第二参数是一个自旋锁,当进行优化时,锁住不被其它程序中断
使用内存模拟磁盘
static request_queue_t *ramblock_queue;
ramblock_buf = kzalloc(RAMBLOCK_SIZE, GFP_KERNEL);
static void do_ramblock_request(request_queue_t * q)
{static int r_cnt = 0;static int w_cnt = 0;struct request *req;//printk("do_ramblock_request %d\n", ++cnt);while ((req = elv_next_request(q)) != NULL) {/* 数据传输三要素: 源,目的,长度 *//* 源/目的: */unsigned long offset = req->sector * 512;/* 目的/源: */// req->buffer/* 长度: */ unsigned long len = req->current_nr_sectors * 512;if (rq_data_dir(req) == READ){//printk("do_ramblock_request read %d\n", ++r_cnt);memcpy(req->buffer, ramblock_buf+offset, len);}else{//printk("do_ramblock_request write %d\n", ++w_cnt);memcpy(ramblock_buf+offset, req->buffer, len);} end_request(req, 1);}
}
2)把块设备和gendisk结构体联系起来
此时结构体和创建的块设备还是相互独立的,把主设备号赋予结构体
3) 建立并赋予块设备操作结构体block_device_operations
类似于字符设备的file_operations结构体,如果使用/dev接口访问块设备,最终就会回调这个操作方法集的注册函数。一般只需要完善getgeo即可,获得磁盘的空间大小
4)设置gendisk结构体的扇区数
使用set_capacity()函数,(gendisk结构体成员copacity), size等于扇区数,一个扇区512
5)注册gendisk类型对象到内核
使用函数void add_disk(struct gendisk *disk);完成这步,一个完整的块设备就完成
第三步:
在出口把所有注册的资源全部删除
34.驱动--块设备驱动相关推荐
- Linux块设备驱动-MTD子系统
Linux块设备驱动 块设备驱动 块设备驱动的引入 1. 简单字符驱动程序思想 2. 块设备驱动程序思想 块设备驱动框架 1. 层次框架 2. 分析ll_rw_block 块设备驱动程序编写 1.分配 ...
- Linux驱动开发|块设备驱动
块设备驱动 块设备驱动是 Linux 三大驱动类型之一,块设备驱动比字符设备驱动复杂得多,不同类型的存储设备又对应不同的驱动子系统,下面介绍块设备驱动框架及使用 一.块设备介绍 块设备是针对存储设备的 ...
- Linux驱动开发 15 块设备驱动框架
CAN I.MX6ULL 带有两个 CAN 控制器: FlexCAN1 和 FlexCAN2 , NXP 官方的 EVK 开发板这两个 CAN 接口都用到了,因此 NXP 官方的设备树 ...
- 转载:谢谢原作者:块设备驱动实战基础篇四 (逐渐成型,加入ioctl通信机制)
1.6介绍一种内核与用户空间通信的方法-misc设备ioctl机制 块设备驱动开发中往往需要配合用户态的管理程序工具,管理我们的块设备,此时我们需要涉及用户空间程序与块设备通信的方法,ioctl机制就 ...
- 转载:谢谢原作者: 块设备驱动实战基础篇二 (继续完善170行过滤驱动代码至200行)
1.3块设备驱动关键数据结构及函数API详细剖析 经过上节四个步骤我们已经熟悉并实战了一个最基本的过滤块设备驱动的设计技巧,我们这一节先不继续实战,我们本节把上节170行代码中接触到的块设备核心数据结 ...
- 转载:谢谢原作者:块设备驱动实战基础篇一 (170行代码构建一个逻辑块设备驱动)
1 内核块设备驱动基础学习与实战 1.1 设备驱动IO架构初探 操作系统是如何将数据读到缓冲区的,发生了什么?我们带着这样的问题,粗略走一下read调用系统过程,希望这个初探,可以唤起大家研究操作 ...
- 转:写一个块设备驱动
----------------------- Page 1----------------------- 第 1章 +---------------------------------------- ...
- Linux驱动开发--写一个块设备驱动
原文地址:[原创] 写一个块设备驱动 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2017377&fromuid=288 ...
- linux内核的块设备驱动框架详解
1.块设备和字符设备的差异 (1)块设备只能以块为单位接受输入和返回输出,而字符设备则以字节为单位.大多数设备是字符设备,因为它们不需要缓冲而且不以固定块大小进行操作; (2)块设备对于 I/O 请求 ...
最新文章
- 【转】VC++ MFC文件的移动复制删除更名遍历操作
- spi iic和串口的区别_GMII、SGMII和SerDes的区别和联系
- 转载:(C/C++函数返回多个值)
- linux l字符串,Linux shell 字符串常用操作
- 不想打造物联网的制造型企业不是一家合格的百年老店
- shiro的源码分析(一)
- python两数相加有进退位_仁裁者、Python之父Guido“退位”,python何去何从?
- anaconda安装numpy_Python3.8如何安装Numpy
- 3.5 Java经典垃圾收集器介绍
- GoodUserInterface 模仿页面功能
- 小谈暴风影音并给个小建议
- 随机前沿方法和数据包络分析
- 项目开发日报表(第一天)
- ANSYS有限元分析
- Android开门动画和关门动画的实现
- 解决退格键在MinGW的vim中不起作用的问题
- 可以写一个表白代码吗
- 虚拟服务器的克隆,怎么克隆远程服务器上的虚拟机
- gunicorn 详解
- 短短十言,把人生说透了.