Linux 0.11源码阅读笔记-块设备驱动程序

块设备驱动程序

块设备驱动程序负责读写块设备数据。内核代码使用缓冲区块与块设备(如磁盘)间接交换数据,缓冲区数据通过块设备驱动程序和块设备交换。

[En]

The block device driver is responsible for reading and writing block device data. Kernel code uses buffer blocks to exchange data indirectly with block devices (such as disks), and buffer data is exchanged through block device drivers and block devices.

Linux 0.11源码阅读笔记-块设备驱动程序

块设备的管理

块设备表

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

Linux 0.11源码阅读笔记-块设备驱动程序
  • current_request:指向设备请求队列第一个节点,请求队列通过链表实现。
  • request_fn:函数指针,用于处理请求队列里面的读写请求。

设备请求队列

内核为每个块设备维护一个请求队列,请求队列中请求等待被处理,current_request指向设备请求队列。

  • 请求项

用于描述请求操作,包括读写磁盘扇区位置信息、缓冲区地址信息、操作类别(读写)信息等。

[En]

Used to describe the request operation, including read and write disk sector location information, buffer address information, operation category (read / write) information, etc.

请求项数据结构:

Linux 0.11源码阅读笔记-块设备驱动程序
  • 请求项数组

被分成请求项大小的块以形成充当内存池的数组的一段连续内存。请求队列中请求项的内存从请求项数组中分配,请求操作完成后,将请求项释放回内存池。

[En]

A piece of contiguous memory that is divided into blocks the size of a request item to form an array that acts as a memory pool. The memory of the request item in the request queue is allocated from the request item array, and after the request operation is completed, the request item is released back to the memory pool.

  • 请求队列

在处理读写设备请求时,从请求项数组中获取空闲块,建立请求项,并将其插入到设备请求队列中。

[En]

When processing a read-write device request, get a free block from the request item array, establish the request item, and insert it into the device request queue.

Linux 0.11源码阅读笔记-块设备驱动程序

块设备操作方式

在内核与块设备进行数据交换(IO)时,涉及到三个对象之间的交互作用,其中主要需要了解系统和控制器之间的交互过程。

  • SYSTEM(内核):内核可以向控制器发送命令(发出请求),也可以等待设备控制器发出中断请求(完成请求)。
    [En]

    system (kernel): the kernel can send commands to the controller (make a request) or wait for the device controller to issue an interrupt request (complete request).*

  • 控制器:完成读写操作后,向系统(CPU)发出中断。
  • 驱动程序:由设备控制器控制
    [En]

    driver: controlled by device controller*

Linux 0.11源码阅读笔记-块设备驱动程序

写数据过程

  1. 系统向控制器发出写命令后,等待块设备准备好接收数据,期间CPU需要主动查询控制器的状态寄存器判断是否准备好接收数据(忙等待)。
  2. 控制器准备好后,CPU将数据写入控制器的缓存中。(控制器具有一块缓存)
  3. 控制器将缓存中的数据通过驱动器全部写入块设备。
  4. 向CPU发出中断,中断处理程序完成写数据后的处理

读数据过程

  1. 向控制器发出读命令
  2. 控制器读取磁盘数据到其缓存中
  3. 向系统发起中断,中断处理程序从控制器缓存中取走数据

请求队列处理过程

ll_rw_block函数将请求放入块设备请求队列,设备中断处理程序会不断处理请求队列,直到队列为空。

  • *写请求的处理过程

  • ll_rw_block为写请求建立请求项,并插入设备的请求队列。 若插入前队列为空,则调用请求项操作函数(request_fn)处理当前写请求,对块设备进行写操作。

  • 设备块设备完成一个写请求后,向CPU发出中断信号,CPU运行中断处理函数。
  • 中断处理程序判断是否还有数据要写(一个请求会可能写多个扇区),如果有则继续写,然后等待下一次中断,这一过程重复直到该写请求数据全部写入设备。
  • 完成数据写之后,中断处理程序将唤醒一些等待进程
  • 唤醒等待该请求项有关数据的相关进程
  • 唤醒等待请求项的进程(当内存池没有空闲请求项时,将导致某些请求读写的进程睡眠)
  • 释放当前请求项并从链表中删除该请求项以及释放锁定的相关缓冲区。
  • 唤醒等待进程后,中断处理程序将调用请求项操作函数处理下一个 读/写请求

  • *读请求处理过程

与写请求处理过程类似

  • *ll_rw_block与中断处理程序

ll_rw_block,负责将读写请求放入队列中,并 启动对请求队列的处理。

中断处理程序,在设备完成读写操作后,它发出中断并继续处理请求队列中的请求操作,直到请求队列为空。

[En]

Interrupt handler, after the device completes the read and write operation, it issues an interrupt and continues to process the request operation in the request queue until the request queue is empty.

相关知识

  • I/O调度算法,读写请求不是按访问顺序放入请求队列的,0.11内核使用电梯算法调度读写请求

总结

  • 每个块设备都有一个请求队列,对块设备的读写请求都会插入到队列中。
    [En]

    each block device has a request queue, and read and write requests to the block device are inserted into the queue.*

  • 中断处理程序继续处理请求队列中的请求,直到队列为空。在请求完成后,一些等待的进程被唤醒。
    [En]

    the interrupt handler continues to process requests in the request queue until the queue is empty. After a request is completed, some waiting processes are awakened.*

Original: https://www.cnblogs.com/lazyfiish/p/16079465.html
Author: LazyFish
Title: Linux 0.11源码阅读笔记-块设备驱动程序

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/523920/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • windows下安装virtualenv并且配置指定环境

    下面是在windows下通过virtualenv创建虚拟环境, 包括 : 安装virtualenv(使用pip可直接安装) 使用virtualenv创建指定版本的虚拟环境 进入虚拟…

    Linux 2023年6月6日
    0107
  • Docker部署

    部署Docker 1.部署docker相关 此章描述在新的服务器上安装docker容器。 1.1 概述 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apach…

    Linux 2023年6月7日
    0154
  • 内核同步问题

    linux内核同步问题 Linux内核设计与实现 十、内核同步方法 [手把手教Linux驱动5-自旋锁、信号量、互斥体概述](https://www.cnblogs.com/yik…

    Linux 2023年6月13日
    089
  • 三少玩Linux之Debian10.3(buster), win7共存的安装方法

    这个是debian10.3的安装视频:https://www.bilibili.com/video/BV1iE411x7ww, win7就不用教了吧; 先装win7, 再装debi…

    Linux 2023年6月14日
    0105
  • locate-updatedb命令检索不全

    执行updatedb 命令,用于立刻更新locate 命令所必需的数据库文件,但有些文件可能会在检索过程中被过滤掉。 有时候明明存在的文件,用find 命令都能搜得出来,但用loc…

    Linux 2023年6月13日
    098
  • 面试连环炮系列(二十️五):RocketMQ怎么保证消息不丢失

    A. 从Producer的视角来看:如果消息未能正确的存储在MQ中,或者消费者未能正确的消费到这条消息,都是消息丢失。 B. 从Broker的视角来看:如果消息已经存在Broker…

    Linux 2023年6月6日
    0150
  • [云原生]Kubernetes-数据存储(第8章)

    一、基本存储 1.1 EmptyDir 1.2 HostPath 1.3 NFS 二、高级存储 2.1 PV 2.2 PVC 2.3 生命周期 三、配置存储 3.1 ConfigM…

    Linux 2023年6月13日
    086
  • .Net中Aspose组件调试技巧

    | 0.48分钟 | 774.4字符 | 1、引言&背景 2、水印或截断问题解决 3、即时调试的技巧 4、声明与参考资料 | SCscHero | 2022/6/4 PM2…

    Linux 2023年6月13日
    087
  • redis 基于SpringBoot Reids 的工具类

    redis 基于SpringBoot Reids 的工具类 package com.mhy.springredis.utils; import org.springframewor…

    Linux 2023年6月7日
    0125
  • Gitlab 403 forbidden 并发引起IP被封

    问题 在工作中自搭建的Gitlab。但今天打开页面的时候显示的是空白页面,上面还有一次文本Forbidden。 原因 Gitlab使用rack_attack做了并发访问的限制。 解…

    Linux 2023年6月14日
    087
  • 在VS code使用Remote-SSH远程连接Linux 开发C++ 配置详细介绍

    VS code 远程连接服务器,编译C++ 一、前期准备 1、VS code安装 Remote-SSH插件 2、Windows安装SSH。 3、Linux服务器连接测试。 a.接通…

    Linux 2023年5月27日
    0168
  • OpenStack 发放云主机

    登陆网址 具体安装步骤欢迎参照我的博客:https://www.cnblogs.com/kongshuo/p/16618008.html用户名 admin 密码 redhat 创建…

    Linux 2023年6月8日
    0124
  • 函数调用栈

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这个分栏我们开始学习PWN,当然PWN也是自己的兴趣爱好,所以可能博客更新…

    Linux 2023年6月13日
    0129
  • jquery ajax提交数据给后端

    大家好,今天铁柱兄给大家带一段jquery ajax提交数据给后端的教学。 初学javaweb的同学前端提交数据基本上都是用form表单提交,这玩意儿反正我是觉得不太好玩。而Jav…

    Linux 2023年6月13日
    094
  • Celery + Redis 的探究

    不在乎过程的,可以直接看最后的结论。 测试代码: 先将 redis 部署于本机的 6379 默认端口 不要设置密码,使用 celery 版本 3.1.23 [1]先直接发起一个 t…

    Linux 2023年5月28日
    076
  • LAMP 架构介绍及环境搭建

    1、LAMP 架构介绍及环境搭建 1.LAMP分别代表什么? L代表服务器操作系统使用Linux A代表网站服务使用的是Apache软件基金会中的httpd软件 M代表网站后台使用…

    Linux 2023年6月7日
    0115
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球