块设备驱动程序的框架

原创 2017年03月21日 23:52:17

我们大概来猜一下它的框架是怎么样的

应用程序  open read write一个普通的文件“1.txt”

1.txt最终肯定要操作硬件啊,比如硬盘啊 flash等等

然后中间是块设备驱动程序,对普通文件的读写肯定要转换成对块设备文件的读写,你要读写哪一个扇区,那谁来把文件的读写来转换成对扇区的读写呢???

中间就引入了文件系统


ll_rw_block是通用的入口  这ll_rw_block会把读写放入队列 调用队列的处理函数,队列的处理函数会优化啊 调顺序啊

我们可以看看ll_rw_block 

文件系统把对文件的读写,转换为对块设备 扇区的读写最终就会调用这个底层的函数ll_rw_block 意思就是底层的读写块


第一个参数rw表示是读还是写,数据传输3要素源 目的 长度放到哪里呢 放到buffer_head里面 是个数组,但是数组里面有多少项呢 ,用nr来表示

我们来看看这个函数做了什么事情


先做了一个循环,我们只抓重要的一点提交 submit_bh  提交buffer_head

先分析到这里

大家看这个文件也挺有意思的,它处于文件系统的,看一下内核目录,内核文件目录下面有各种具体的文件系统,所谓文件系统就是文件的组织格式,它是一种纯软件的概念


这些.c应该是通用的文件,我们这个ll_rw_block位于buffer.c里面,它是一个通用的文件,并且文件名很有意思是buffer.c  之前我们不是说对块设备的读写并不会立刻执行而是把它放到一个队列里面,先把它缓存起来。

我们来看看提交buffer_head做了什么事情



第一行 struct bio *bio 使用bh来构造bio bio是什么意思呢 是block input/output 块设备输入输出 然后提交bio  接着往里面看,看提交bio又做了什么事情


generic_make_request 通用的构造请求 使用bio来构造请求

看看这个函数


又调用__generic_make_request(bio); 这个函数,进入这个函数


bdev_get_queue获得队列

这个q是什么东西


是request_queue 请求队列


然后这里就是调用队列里的一个函数

看名字是构造请求的函数,我们有默认的函数,我们搜索看这个变量在哪里被设置

默认函数是__make_request  我们来看看这个函数做了什么事情


elv_merge合并

代码是先尝试合并

elv是电梯调度算法的意思

什么叫电梯调度算法呢

我们回过头来看一看

我们之前说硬盘优化怎么做呢,我先读

读完之后再来写,我一次先上,然后在下,我一次运输尽可能传输更多的人

以电梯调度算法合并请求

如果能何必就最好了,如果不能合并就使用bio构造一个请求,然后把请求放入队列



这就是我们块设备驱动程序的框架


那我们怎么写块设备驱动程序呢

分配/设置队列 request_queue_t 这个队列干什么用的 这个队列只是给我们提供了读写的能力而已  还要提供读写能力 还需要提供属性:如容量等

1.分配一个gendisk alloc_disk

2.设置

2.1  分配/设置队列 request_queue_t   //提供读写能力

blk_init_queue

2.2  设置gendisk其他信息  提供属性

3 注册 add_disk






















块设备驱动程序之一

一、块设备概述 linux支持的两种重要的设备类型分别是字符设备和块设备,块设备可以随机地以固定大小的块传送数据。与字符设备相比,块设备有以下几个特殊之处: 块设备可以从数据的任何位置进行访问块数据...
  • goodluckwhh
  • goodluckwhh
  • 2014年02月10日 23:41
  • 4235

《Linux设备驱动程序》——块设备驱动程序

块设备驱动程序
  • Explorer_day
  • Explorer_day
  • 2014年12月05日 11:29
  • 1406

Linux块设备驱动(一) _驱动模型

http://www.cnblogs.com/xiaojiang1025/p/6500557.html 块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类...
  • zdy0_2004
  • zdy0_2004
  • 2017年03月21日 21:10
  • 715

块设备驱动架构分析

1. 块设备概念:块设备是指只能以块为单位进行访问的设备,块的大小一般是512个字节的整数倍。常见的块设备包括硬件,SD卡,光盘等。 2. 块设备驱动的系统架构 2.1 系统架构---VFS VFS是...
  • coding__madman
  • coding__madman
  • 2016年06月06日 22:34
  • 3840

Linux块设备驱动总结

《Linux设备驱动程序》第十六章 块设备驱动程序读书笔记 简介 一个块设备驱动程序主要通过传输固定大小的随机数据来访问设备 Linux内核视块设备为与字符设备相异的基本设备类型 Linu...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月26日 08:36
  • 1485

一个简单的块设备驱动的实现

一个简单的块设备驱动的实现 这篇文章系列来自原创作者:赵磊,感谢这位作者,链接为:http://bbs.chinaunix.net/thread-2017377-1-1.html ...
  • chenglinhust
  • chenglinhust
  • 2013年05月09日 11:23
  • 1729

块设备的驱动程序框架

框架: app:    open, read, write, "1.txt" -------------------------------------------------------------...
  • sinat_24088685
  • sinat_24088685
  • 2016年05月23日 10:09
  • 418

块设备驱动实例

摘自:http://my.oschina.net/heiden/blog/194505 将ldd3(linxu device driver 3)中块设备驱动部分的代码在redhat6.3下编译时,会...
  • chinaclock
  • chinaclock
  • 2015年11月18日 14:39
  • 1306

Tiny6410开发板下块设备驱动程序的编写驱动之用内存模拟磁盘(二)

接上篇,框架搭好之后,可以进行内存模拟磁盘 3th 在ramblock_init 函数中加入硬件相关操作 static unsigned char *ramblock_buf; ...
  • kanlei1234
  • kanlei1234
  • 2014年12月22日 17:17
  • 358

块设备驱动程序分析

字符设备三部曲:     alloc_chrdev_region(&devid, 0, HELLO_CNT, "hello");        cdev_init(&hello_cdev, &hell...
  • lizuobin2
  • lizuobin2
  • 2016年10月06日 17:36
  • 1240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:块设备驱动程序的框架
举报原因:
原因补充:

(最多只允许输入30个字)