块设备驱动程序的框架

原创 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






















版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

块设备驱动程序分析之框架构建

这一节里实际上是将块设备驱动程序的框架给勾勒出来,并不做具体的事情,下面看代码: #include #include #include #include #include...

块设备驱动程序之nandflash——基本框架

我们先查看内核的启动信息,以搞清楚从哪个文件着手来分析: S3C24XX NAND Driver, (c) 2004 Simtec Electronics s3c2440-nand s3c24...

块设备驱动程序之nandflash——基本框架

我们先查看内核的启动信息,以搞清楚从哪个文件着手来分析: S3C24XX NAND Driver, (c) 2004 Simtec Electronics s3c2440-nand s3c24...

.块设备驱动程序框架

韦东山老师帮我们把框架搭建起来了,我们先来看一下: 框架: app:      open,read,write "1.txt" -------------------------...

块设备驱动程序分析之框架构建

这一节里实际上是将块设备驱动程序的框架给勾勒出来,并不做具体的事情,下面看代码: #include #include #include #include #include...

Linux字符设备驱动程序的编写框架

一、Linux device driver 的概念   系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在...

设备驱动程序框架分析——(以点灯为例)

框架分析如下/*①写出led_open() led_write()函数*/ static int first_drv_open(struct inode *inode, struct file *fi...

如何编写Linux设备驱动程序 - 框架入门

序言   Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似 于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱...

字符设备驱动程序框架

字符设备驱动程序框架 (2012-03-21 17:36) 1、写出open、write函数 2、告诉内核 1)、定义一个struct file_operations结构并填充好 st...

Linux字符设备驱动程序框架

1:注册设备,注册设备或者模块加载的时候,必须将设备登记到内核相应的设备数组,并返回设备的主设备号 2:定义功能函数,对于每一个驱动函数来说,都有一些和该设备密切相关的功能函数,拿最常用的字符设备来...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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