linux3.4.2内核之块设备驱动
1. 基本概念:
扇区(Sectors):任何块设备硬件对数据处理的基本单位。通常,1个扇区的大小为512byte。(对设备而言)
块 (Blocks):由Linux制定对内核或文件系统等数据处理的基本单位。通常,1个块由1个或多个扇区组成。(对Linux操作系统而言)
段(Segments):由若干个相邻的块组成。是Linux内存管理机制中一个内存页或者内存页的一部分。
2. 块设备结构体:
static const struct block_device_operations blk_ops = {
.owner = THIS_MODULE,
.open = blk_open,
.release = blk_release,
};
3. 创建块设备:
3.1静态创建(主设备号自己定义)
register_blkdev(MAJOR,"z-block");
3.2 动态创建(内核自动分配主设备号)
major = register_blkdev(,"z-block");
4. 分配一个gendisk结构体,用来描述磁盘信息
blkdisk = alloc_disk();//磁盘分区数,次设备个数 = 分区数 + 1
5. 创建队列
内核驱动访问块设备,进行输入输出操作,都需要发送请求。但有些磁盘请求速度缓慢,影响了读写速度,所以引入了队列。采用电梯算法,先将请求放入队列,优化后执行,提高了块设备的访问速度。
blk_queue = blk_init_queue(do_request, &blk_spin);
其中第一个参数是队列的处理函数,第二个参数是队列访问权限的自旋锁。定义如下
static DEFINE_SPINLOCK(blk_spin);
6. 将队列告诉gendisk结构体
blkdisk->queue = blk_queue;
7. 确定主、次设备号及操作函数
blkdisk->first_minor = 0;
blkdisk->major = major;
sprintf(blkdisk->disk_name, "zblock");
blkdisk->fops = &blk_ops;
注意这里不加sprintf这句话,最后insmod会出错。具体原因我也还不知道。
8. 定义配磁盘容量(大小)
set_capacity(blkdisk, SIZE);//设置扇区数
9. 分配一块空间,作为源/目的
block_buf = kzalloc(BUFFERSIZE, GFP_KERNEL); //分配一块空间,作为源/目的
10. 向内核注册gendisk结构体
add_disk(blkdisk);
11. 请求队列处理函数
11.1 while循环使用elv_next_request()获取申请队列中每个未处理的申请,这是Linux2.6.22.6里的函数,对于linux3.4.2内核,应该使用blk_fetch_request函数;
11.2 使用rq_data_dir()来获取每个申请的读写命令标志,为 0(READ)表示读, 为1(WRITE)表示写;
11.3 使用memcp()来读或者写扇区(缓存);
11.4 linux2.6使用end_request()来结束获取的每个申请,linux3.4.2使用函数__blk_end_request_cur;
12. 磁盘格式化
/mnt # mkdosfs /dev/zblock
13. 挂载磁盘
/mnt # mount /dev/zblock tmp/
在tmp/目录下写数据,实际上写到了块设备/dev/zblock里面。cat /dev/zblock > /tmp/zblock.bin就可以将/dev/zblock里的数据传到/tmp/zblock.bin。
完整程序见https://www.cnblogs.com/zhu-g5may/p/9314403.html
linux3.4.2内核之块设备驱动的更多相关文章
- Linux 块设备驱动 (一)
1.块设备的I/O操作特点 字符设备与块设备的区别: 块设备只能以块为单位接受输入和返回输出,而字符设备则以字符为单位. 块设备对于I/O请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设 ...
- linux块设备驱动---相关结构体(转)
上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...
- linux块设备驱动之实例
1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major = register_blkdev(sbull_major, "sbull&quo ...
- linux下的块设备驱动(二)
上一章主要讲了请求队列的一系列问题.下面主要说一下请求函数.首先来说一下硬盘类块设备的请求函数. 请求函数可以在没有完成请求队列的中的所有请求的情况下就返回,也可以在一个请求都不完成的情况下就返回. ...
- Linux块设备驱动(一) _驱动模型
块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类设备,本文以3.14为蓝本,探讨内核中的块设备驱动模型 框架 下图是Linux中的块设备模型示意图,应用层程序有两种方式访问一 ...
- Linux块设备驱动(二) _MTD驱动及其用户空间编程
MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...
- 【转】 bio 与块设备驱动
原文地址: bio 与块设备驱动 系统中能够随机访问固定大小数据片(chunk)的设备被称作块设备,这些数据片就称作块.块设备文件都是以安装文件系统的方式使用,此也是块设备通常的访问方式.块 ...
- 乾坤合一~Linux设备驱动之块设备驱动
1. 题外话 在蜕变成蝶的一系列学习当中,我们已经掌握了大部分Linux驱动的知识,在乾坤合一的分享当中,以综合实例为主要讲解,在一个月的蜕茧成蝶的学习探索当中,觉得数据结构,指针,链表等等占据了代码 ...
- linux块设备驱动
块设备驱动程序<1>.块设备和字符设备的区别1.读取数据的单元不同,块设备读写数据的基本单元是块,字符设备的基本单元是字节.2.块设备可以随机访问,字符设备只能顺序访问. 块设备的访问:当 ...
随机推荐
- ProxySQL读写分离
我们首先看一下自己的环境: MHA已经搭建: master: slave: slave: MHA manager在172.16.16.34,配置文件如下: [root@localhost bin]# ...
- [翻译] JHChainableAnimations
JHChainableAnimations - (void)animationType_01 { /* * 缩放到0.8倍(执行spring动画效果的缩放)持续时间0.5s,完成了之后移动100的距离 ...
- Linux下的Mysql的远程访问
mysql的服务端[192.168.25.136] 1,在远程访问之前需先配置防火墙 service iptables stop (不推荐,可配置开通3306端口) 2,授权 mysql> gr ...
- Mysql常用语句与函数(待续)
-- 查询语句select class from stu_info where sid=1000000102;select * from stu_info t where t.age=88; -- t ...
- 沉淀再出发:关于IntelliJ IDEA使用的一些总结
沉淀再出发:关于IntelliJ IDEA使用的一些总结 一.前言 在使用IDEA的时候我们会发现,如果我们先写了一个类的名字,而没有导入这个类的出处,就会提示出错,但是不能自动加入,非常的苦恼,并且 ...
- 沉淀,再出发:PHP的简单使用
沉淀,再出发:PHP的简单使用 一.前言 关于PHP,笔者在本科的时候就听到了太多太多,可惜虽然看了很多的教材,听到了无数遍,也没有系统性的整理过和学习过这方面的知识,这点无论什么时候想起来都是一种遗 ...
- javascript对象和函数的几种常见写法
/** * Created by chet on 15/12/17. */ var En= function (button,func) { //dosth,不能return alert(button ...
- UVA 10288 Coupons---概率 && 分数类模板
题目链接: https://cn.vjudge.net/problem/UVA-10288 题目大意: 一种刮刮卡一共有n种图案,每张可刮出一个图案,收集n种就有奖,问平均情况下买多少张才能中奖?用最 ...
- Java虚拟机6:垃圾收集(GC)-1(内存溢出和内存泄漏的区别)
1.前言 在进行垃圾收集之前需要普及几个比较重要的概念. 2.内存溢出和内存泄露的概念和区别: (1):内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间可以分配,系统不 ...
- background-clip 实现字体渐变效果
background-clip 实现字体渐变效果 (一)类似KTV字幕效果 @-webkit-keyframes loop{ 0%{background-position: -800px 0;} 10 ...