首页 > 编程语言 >kernel源码(二十二)块设备

kernel源码(二十二)块设备

时间:2023-07-22 09:14:11浏览次数:46  
标签:二十二 kernel 请求 request struct dev 源码 blk 设备

操作系统所有设备可分为两类:块设备和字符设备。

块设备是一种可以以固定大小的数据块为单位进行寻址和访问的设备,例如硬盘、软盘。

字符设备是一种以字符流作为操作对象的设备,不能进行寻址操作,例如打印机、网卡、终端设备。

为便于管理,操作系统将这些设备统一的以设备号进行分类。linux0.11内核将设备分成7类

主设备号 类型 说明
0
1 块/字符 ram,内存设备
2 fd,软盘
3 hd,硬盘
4 字符 ttyx,虚拟或串行终端
5 字符 tty设备
6 字符 lp打印机设备

代码路径:kernel/blk_drv

1 总体介绍

对hd和fd块设备上的数据的读写操作是通过中断处理程序进行的。内核每次读写的数据量以一个逻辑块(1024byte)为单位。

1.1 一次块设备读写流程

  1. 程序要读取硬盘上的某个块
  2. 向缓冲区管理程序提出申请
  3. 进程进入睡眠等待状态
  4. 首先在缓冲区中寻找这个数据块
  5. 找到则将对应缓冲区块头指针返回给程序
  6. 唤醒进程
  7. 如果缓冲区中未找到该区块
  8. 调用ll_rw_block()向硬盘驱动发送读请求
  9. ll_rw_block()会为此创建一个请求结构项,插入到请求队列里面
  10. 若对应块设备请求项队列为空,说明该设备空闲。内核向该块设备控制器发送读数据命令
  11. 块设备控制器将数据读入指定的缓冲块中
  12. 块设备控制器继续读取其他块或结束本次请求项
  13. 该请求项结束之后,关闭块设备,设置缓冲区数据已更新标志
  14. 唤醒等待该数据块的进程

1.2 块设备请求项

从上面的块设备读取数据的过程我们知道,ll_rw_block()是通过请求项来与各种块设备建立联系并发出读写请求的。

块设备请求结构

struct request {
    int dev;        /* -1 if no request */ //设备号
    int cmd;        /* READ or WRITE */ //读或写
    int errors; //读操作时产生的错误次数
    unsigned long sector; //起始扇区
    unsigned long nr_sectors; //扇区数
    char * buffer; //数据缓冲区
    struct task_struct * waiting; //等待该块设备的任务
    struct buffer_head * bh; //缓冲区头指针
    struct request * next; //指向下一请求项
};

块设备请求项

struct blk_dev_struct {
    void (*request_fn)(void); //处理对应块设备的函数指针,比如do_hd_request()
    struct request * current_request; //当前请求项
};

共有7种设备,使用一个数组blk_dev来存储各种块设备的请求项,数组大小为7

extern struct blk_dev_struct blk_dev[7];

1.3 请求队列

请求项除了在上述blk_dev[i]->current_request中有存放外,还专门设置了一个数组来存放所有设备的请求项,共可容纳32个请求项。这里的request[]就是请求队列

extern struct request request[32];

blk_dev[]数组和request[]队列之间的关系如下图所示

 

标签:二十二,kernel,请求,request,struct,dev,源码,blk,设备
From: https://www.cnblogs.com/zhenjingcool/p/17572816.html

相关文章

  • 火焰图是怎么画出来的?Pyroscope源码解析之火焰图
    火焰图简述火焰图(FlameGraph)由BrendanGregg在2011年创造,是一种可视化程序性能分析工具,它可以帮助开发人员追踪程序的函数调用以及调用所占用的时间,并且展示出这些信息。  一般性解释火焰图的基本思想是将程序的函数调用栈转化为一个矩形的“火焰”形图像,每个矩形的......
  • YOLOv6在LabVIEW中的推理部署(含源码)
    前言YOLOv6是美团视觉智能部研发的一款目标检测框架,致力于工业应用。如何使用python进行该模型的部署,官网已经介绍的很清楚了,但是对于如何在LabVIEW中实现该模型的部署,笔者目前还没有看到相关介绍文章,所以笔者在实现YOLOv6ONNX在LabVIEW中的部署推理后,决定和各位读者分享一下......
  • 成品直播源码推荐,猜数字小游戏
    成品直播源码推荐,猜数字小游戏 #!/usr/bin/python3'''-*-coding:utf-8-*-@Author :Qixi@Time  :2022/1/2715:52@Software:PyCharm@File  :guessingGame.py'''#guessing_gamefromrandomimportrandintfromIPython.displayimportclear_ou......
  • 直播带货源码,JS实现轮播图点击切换、按钮切换功能
    直播带货源码,JS实现轮播图点击切换、按钮切换功能html代码: <div>    <pid="pa"></p>    <imgsrc="1.jpg"alt="">    <buttonid="lt"><</button>    <buttonid="gt">>&l......
  • 多语言高并发接入阿里巴巴电商平台,获取实时商品详情数据源码,API接口技术开发分享
    接口数据展示alibaba.item_get-获得商品详情公共参数请求地址:注册key和secret接入请私信名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString......
  • 多语言高并发接入阿里巴巴电商平台,获取实时商品详情数据源码,API接口技术开发分享
    接口数据展示alibaba.item_get-获得商品详情公共参数请求地址:注册key和secret接入名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_sear......
  • nacos适配达梦、瀚高、人大金仓数据库及部分源码探究
    一.插件实现1.插件目录结构2.pom依赖<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-datasource-plugin</artifactId><version>2.2.4</version></d......
  • html 数据可视化大屏展示模板源码分享(第一期)
    1、angular+echart.js统计数据图表读取投屏数据大屏2、生意参谋大数据可视化HTML模板3、大数据可视化展板通用模板4、基于echarts实现的销售统计数据可视化大屏模板5、新能源车联网综合大数据平台6、厅店效能大屏监控看板7、东海省交通大数据分析平台8、基于echarts......
  • 视频直播源码,实现pdf在线预览并且自定义预览框高度
    视频直播源码,实现pdf在线预览并且自定义预览框高度 <!-- *@Author:WenZhiming *@Date:2022-09-2617:17:55 *@LastEditors:WenZhiming *@LastEditTime:2022-09-2618:03:13 *@Description:filecontent--><template> <divclass="container_uploadrelative"......
  • kernel: mysqld invoked oom-killer: gfp_mask
    LinuxOOM-Killer:解释与代码示例引言当在运行中的Linux系统中内存不足时,操作系统会调用OOM-Killer(OutofMemoryKiller)来终止某些进程以释放内存。这通常发生在操作系统无法为新的进程或正在运行的进程分配所需的内存时。本文将介绍OOM-Killer的工作原理并提供相应的代码......