ll_rw_block是文件系统对下访问实际的块设备驱动的接口,应用程序对实际文件(非设备文件)的操作,最终都是

通过文件系统来调用ll_rw_block来操作实际的存储设备的。

当然ll_rw_block的实际作用远非一个接口那么简单,他里面对维护了一个读写请求队列,并且对队列里读写请求进

行了优化,比如,对机械硬盘来说,使用了电梯算法,对队列里的读写请求进行优化,排序,合并等操作,提高了

访问硬盘的效率。优化后,最后调用实际的块设备驱动程序来操作真正的存储设备。

下面,以bbb的TI官方linux源码(sdk6)来大概将ll_rw_block的流程写一下,以免忘记。

void ll_rw_block(int rw, int nr, struct buffer_head *bhs[])        // fs/buffer.c

{

//rw为读写标志,nr为bhs数组的长度, bhs为实际要对写数据的信息数组,源,目的,长度

for (i = 0; i < nr; i++) {
              struct buffer_head *bh = bhs[i];
              if (rw == WRITE) {
            submit_bh(WRITE, bh);     //提交写请求
              } else {
            submit_bh(rw, bh);             //提交读请求
             }
       }

}

int submit_bh(int rw, struct buffer_head * bh)         // fs/buffer.c

{
         struct bio *bio;

//这里省略了一系列的使用bh来构造bio的代码,最终提交bio
        bio_get(bio);
        submit_bio(rw, bio);           //提交bio
}

void submit_bio(int rw, struct bio *bio)                //block/blk-core.c
{
        generic_make_request(bio);             //使用bio来构造请求
}

void generic_make_request(struct bio *bio)        //block/blk-core.c
{
         struct request_queue *q = bdev_get_queue(bio->bi_bdev);          //获得请求队列

q->make_request_fn(q, bio);                      //调用请求队列的make_request_fn
}

make_request_fn函数的定义如下:

void blk_queue_bio(struct request_queue *q, struct bio *bio)       //block/blk-core.c
{
        el_ret = elv_merge(q, &req, bio);            //调用电梯算法对读写操作进行优化处理
        __blk_run_queue(q);                              //看下面
}

void __blk_run_queue(struct request_queue *q)           //block/blk-core.c
{
         q->request_fn(q);                                                  //这里最终调用请求队列的request_fn函数进行真正的磁盘操作
}

bbb sdk6 ll_rw_block分析相关推荐

  1. bbb sdk6编译流程

    1. 编译用于ftp启动的镜像 1) uboot make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=flash-restore am335x_evm ...

  2. 痴呆患者血脑屏障(Blood-Brain Barrier, BBB)功能测量

    血脑屏障(BBB)通过调节大部分分子的运输,将体循环与大脑环境分隔开来,保护大脑的微环境.多种结构和功能单位保证了BBB的完整性.研究BBB的破坏有很多成像方式可以选择.然而,血管认知障碍和阿尔茨海默 ...

  3. BBB学习(十八):cape介绍(一)DeviceTree

    文章目录 一.前言 二. Device Tree介绍 2.1 什么是device tree 2.2 device tree文件 2.3 device tree语法结构 2.3.1 结点名称@单元地址 ...

  4. Codeforces Round #703 (Div. 2)(A ~ F)超高质量题解【每日亿题2 / 19】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A. Shifting Stacks B - Eastern Exhibition C1 - G ...

  5. 小波变换和小波包变换

    一.小波变换 1.连续型小波变换 小波变换是一个平方可积函数f(t)f(t)f(t) 与一个时频域上具有良好局部性质的小波函数ψ(t)ψ(t)\psi \left( t \right)的内积: Wf( ...

  6. MYSQL自定义排序

    下面是本人关于mysql 自定义排序(field,INSTR,locate)的一点心得,希望对大家有所帮助 首先说明这里有三个函数(order by field,ORDER BY INSTR,ORDE ...

  7. HDU 5769 Substring(后缀数组)

    Substring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  8. mysql的全文搜索功能

    12.7. 全文搜索功能 12.7.1. 布尔全文搜索 12.7.2. 全文搜索带查询扩展 12.7.3. 全文停止字 12.7.4. 全文限定条件 12.7.5. 微调MySQL全文搜索 MATCH ...

  9. 深入浅出的javascript的正则表达式学习教程

    原文链接 阅读目录 了解正则表达式的方法 了解正则表达式的方法 RegExp对象表示正则表达式,它是对字符串执行模式匹配的工具: 正则表达式的基本语法如下2种: 直接量语法: /pattern/att ...

最新文章

  1. 喜欢把代码写一行的人_我最喜欢的代码行
  2. 网上的python教程值不值得买_Python新人入手线程技术教程,值得收藏
  3. 深入理解JVM——(三)为什么JVM新生代需要两个Survivor区
  4. POJ 1260 Pearls(DP)
  5. 二级python 刷题就能过吗_Python 刷题笔记:这很不python,官方大大能改下吗?
  6. WebCore中的渲染机制(二):块和内嵌(Blocks and Inlines)
  7. DOCX file format element list
  8. C++中如何读取一个数的位数_求1000以内的水仙花数
  9. 2019职称计算机考试哪些地区取消,2019年职称计算机考试注意事项
  10. OpenCV+dlib+Python实现人体五官检测
  11. 高速公路的一些线路坐标、高程计算公式
  12. java映射的概念_Java之路:映射(Map)
  13. python矢量图_使用python制作矢量图
  14. 在linaro中安装opencv
  15. 【博学谷学习记录】超强总结,用心分享 | 人工智能常用数据可视化库 matplotlib 入门(1)
  16. 智能家居系列之智能家居平台设计
  17. Spring的9处调用后置处理器
  18. Docker 下 jitsi-meet 视频服务器 安装部署
  19. 海水淡化三十年打磨一把反渗透膜“利剑”
  20. 在html文字下标标记,在HTML中,下面( )标记可将所修饰的文本显示为下标。(选一项)...

热门文章

  1. 以计算机谈人文科学,阅读下面一段文字,完成问题   自20世纪80年代以来,世界都在谈“软科学技术”,何谓软科学?经常听人说:“脑子不够使。”这其实就是对软科学的需求。于是,从古至今,...
  2. Oracle集合查询
  3. 记事本和textarea中的换行
  4. android 三星 白色,时尚实用都拥有 白色Android手机盘点
  5. 服务注册中心 eureka 搭建
  6. docker 配置文件:/etc/docker/daemon.json
  7. C# FTP 上传、下载、获取文件列表
  8. WPF 获得文件夹路径 FolderBrowserDialog
  9. linux 视频学习
  10. 【数据结构与算法】【算法思想】贪心算法