Linux 0.11源码阅读笔记-块设备驱动程序
块设备驱动程序
块设备驱动程序负责实现对块设备数据的读写功能。内核代码统一使用缓冲块间接和块设备(如磁盘)交换数据,缓冲区数据通过块设备驱动程序和块设备交换数据。

块设备的管理
块设备表
内核通过一张块设备表blk_dev[]管理各种块设备,每个表项对应一个块设备,并为每一个块设备维护一个请求队列。

- current_request:指向设备请求队列第一个节点,请求队列通过链表实现。
- request_fn:函数指针,用于处理请求队列里面的读写请求。
设备请求队列
内核为每个块设备维护一个请求队列,请求队列中请求等待被处理,current_request指向设备请求队列。
- 请求项
用于描述请求操作,包含读写磁盘扇区位置信息、缓冲区地址信息、操作类别(读/写)信息等。
请求项数据结构:

- 请求项数组
一块连续内存,被分割为请求项大小的块,形成数组,充当内存池的角色。请求队列中的请求项的内存从请求项数组中进行分配,请求操作完成后,请求项会被释放回该内存池中。
- 请求队列
处理读写设备请求时,从请求项数组中获取一个空闲块,建立请求项,并插入设备请求队列中。

块设备操作方式
在内核与块设备进行数据交换(IO)时,涉及到三个对象之间的交互作用,其中主要需要了解系统和控制器之间的交互过程。
- 系统(内核):内核可以向控制器发送命令(发出请求)或等待设备控制器发出中断请求(完成请求)。
- 控制器:完成读写操作后,向系统(CPU)发出中断。
- 驱动器:受设备控制器控制

写数据过程
- 系统向控制器发出写命令后,等待块设备准备好接收数据,期间CPU需要主动查询控制器的状态寄存器判断是否准备好接收数据(忙等待)。
- 控制器准备好后,CPU将数据写入控制器的缓存中。(控制器具有一块缓存)
- 控制器将缓存中的数据通过驱动器全部写入块设备。
- 向CPU发出中断,中断处理程序完成写数据后的处理
读数据过程
- 向控制器发出读命令
- 控制器读取磁盘数据到其缓存中
- 向系统发起中断,中断处理程序从控制器缓存中取走数据
请求队列处理过程
ll_rw_block函数将请求放入块设备请求队列,设备中断处理程序会不断处理请求队列,直到队列为空。
- 写请求的处理过程
ll_rw_block为写请求建立请求项,并插入设备的请求队列。若插入前队列为空,则调用请求项操作函数(request_fn)处理当前写请求,对块设备进行写操作。
设备块设备完成一个写请求后,向CPU发出中断信号,CPU运行中断处理函数。
中断处理程序判断是否还有数据要写(一个请求会可能写多个扇区),如果有则继续写,然后等待下一次中断,这一过程重复直到该写请求数据全部写入设备。
完成数据写之后,中断处理程序将唤醒一些等待进程
- 唤醒等待该请求项有关数据的相关进程
- 唤醒等待请求项的进程(当内存池没有空闲请求项时,将导致某些请求读写的进程睡眠)
- 释放当前请求项并从链表中删除该请求项以及释放锁定的相关缓冲区。
唤醒等待进程后,中断处理程序将调用请求项操作函数处理下一个读/写请求。
- 读请求处理过程
与写请求处理过程类似
- ll_rw_block与中断处理程序
ll_rw_block,负责将读写请求放入队列中,并启动对请求队列的处理。
中断处理程序,设备完成读写操作后,发出中断,不断处理请求队列中的请求操作,直到请求队列为空。
相关知识
- I/O调度算法,读写请求不是按访问顺序放入请求队列的,0.11内核使用电梯算法调度读写请求
总结
- 每个块设备具有一个请求队列,对块设备的读写请求被插入到队列中。
- 中断处理程序不断处理请求队列中的请求,直到队列为空。完成某个请求后,会唤醒一些等待的进程。
Linux 0.11源码阅读笔记-块设备驱动程序的更多相关文章
- Linux 0.11源码阅读笔记-文件管理
Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...
- Linux 0.11源码阅读笔记-中断过程
Linux 0.11源码阅读笔记-中断过程 是什么中断 中断发生时,计算机会停止当前运行的程序,转而执行中断处理程序,然后再返回原被中断的程序继续运行.中断包括硬件中断和软件中断,硬中断是由外设自动产 ...
- Linux 0.11源码阅读笔记-总览
Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理.内存管理等主要模块知识. 通过阅读教复杂的代码,锻炼自己复杂项目代 ...
- Linux 0.11源码阅读笔记-总结
总结 Linux 0.11主要包含文件管理和进程管理两个部分.进程管理包括内存管理.进程管理.进程间通信模块.文件管理包含磁盘文件系统,打开文件内存数据.磁盘文件系统包括空闲磁盘块管理,文件数据块的管 ...
- Linux 0.11源码阅读笔记-文件IO流程
文件IO流程 用户进程read.write在高速缓冲块上读写数据,高速缓冲块和块设备交换数据. 什么时机将磁盘块数据读到缓冲块? 什么时机将缓冲块数据刷到磁盘块? 函数调用关系 read/write( ...
- Linux 0.11源码阅读笔记-高速缓冲
高速缓冲 概念 高速缓冲区是内存中的一块内存,在块设备与内核其它程序之间起着一个桥梁作用.内核程序如果需要访问块设备中的数据,都需要经过高速缓冲区来间接的操作. 高速缓冲区结构 高速缓冲区被划分为1k ...
- Linux 0.11源码阅读笔记-内存管理
内存管理 Linux内核使用段页式内存管理方式. 内存池 物理页:物理空闲内存被划分为固定大小(4k)的页 内存池:所有空闲物理页组成内存池,以页为单位进行分配回收.并通过位图记录了每个物理页是否空闲 ...
- 【从头到脚品读 Linux 0.11 源码】第一回 最开始的两行代码
从这一篇开始,您就将跟着我一起进入这操作系统的梦幻之旅! 别担心,每一章的内容会非常的少,而且你也不要抱着很大的负担去学习,只需要像读小说一样,跟着我一章一章读下去就好. 话不多说,直奔主题.当你按下 ...
- linux 0.11 源码学习+ IO模型
http://www.cnblogs.com/Fredric-2013/category/696688.html
随机推荐
- spring boot application.yml 常用基本配置
1.Tomcat 配置 server: #设置请求端口 port: 8080 servlet: #指定 Tomcat的请求路径 context-path: /cl #设置 Tomcat 编码格式 en ...
- JZ-001-二维数组中的查找
二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数 ...
- .NET的两种部署模式,了解一下
前言 以往部署程序一直是习惯性先安装运行时环境,然后再将发布打包好的程序运行起来:但当多个程序依赖不同版本框架平台时,如果部署在同一台机器上,那就需要在同一台机器上安装多个版本的运行时,总感觉有点不太 ...
- 背包四讲 (AcWing算法基础课笔记整理)
背包四讲 背包问题(Knapsack problem)是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高 ...
- Hadoop之Mapreduce 程序
package com.gylhaut.hadoop.senior.mapreduce; import java.io.IOException; import java.util.StringToke ...
- Create Table 实例
1 USE databaseWeb; 2 DROP TABLE IF EXISTS tb_person; 3 CREATE TABLE tb_person( 4 id INTEGER AUTO_INC ...
- 女朋友问我深浅copy到底是什么?
深浅拷贝 列表存放值的时候,是先申请一块内存空间,存放索引和内存地址的对应关系,其实通俗的来说列表内不存真正的值,是一种间接存放的对应关系: 列表内存不可变类型的数据 就比如说,如果现在将L列表索引0 ...
- SINAMICS S120的核心控制单元CU320使用教程,电机模块接线
SINAMICS是西门子公司新一代的驱动产品,它正在逐步取代现有的MASTERDRIVES及SIMODRIVE系列的驱动系统.SINAMICS S120是集V/f控制.矢量控制和伺服控制于一体的多轴驱 ...
- Mysql之锁(二)
1.查看锁 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; -- 记录当前运行的事务 SELECT * FROM INFORMATION_SCHEMA.INN ...
- B树、B+树、B*树三者的对比详解
转载至:https://www.2cto.com/database/201805/745822.html 对比 B+树是B树的变体,B*树又是B+树的变体,是一脉相承法治国拉的,不断解决新一阶段的问题 ...