当前位置: 首页 > news >正文

嵌入式系统 第十二讲 块设备和驱动程序设计

块设备是Linux三大设备之一(另外两种是字符设备,网络设备),块 设备也是通过/dev下的文件系统节点访问。

• 块设备的数据存储单位是块,块的大小通常为512B至32KB不等

• 块设备每次能传输一个或多个块支持随机访问,并且采用了缓存技 术

• 常见的块设备包括IDE硬盘SCSI硬盘CD-ROM等等。

        – IDE:Integrated Device Electronics,集成磁盘电子接口

        SCSI:Small Computer System Interface,小型计算机系统接口

• 12.1 块设备驱动程序设计概要

• 块设备驱动在虚拟文件系统(VFS)中的位置:

 VFS(Virtual File System,虚拟文件 系统)的作用就是 采用标准的Unix系 统调用读写位于不 同物理介质上的不 同文件系统,即为 各类文件系统提供 了一个统一的操作 界面和应用编程接 口。VFS是一个可 以让open()、read()、 write()等系统调用 不用关心底层的存 储介质和文件系统 类型就可以工作的 粘合层。

• 12.1.1 块设备的数据交换方式

– 块设备以块(512B至32KB)为单位进行读写字符设 备以字节为单位进行读写

– 块设备有对应的缓冲区,并使用了请求队列对I/O请求 进行管理,块设备支持随机访问字符设备只能顺序 访问

• 11.1.2 块设备读写请求

– 对块设备的读写都是通过请求实现的。

– Linux中每一个块设备都有一个I/O请求队列每个请求 队列都有调度器的插口,调度器可以实现对请求队列 里请求的合理组织,如合并临近请求,调整请求完成 顺序等。

– Linux 2.6内核有4个I/O调度器(Scheduler)

        ① No-op I/O scheduler:实现了一个简单的FIFO队列;

        ② Anticipatory I/O scheduler:是目前内核中默认的I/O调度器

        ③ Deadline I/O scheduler:是针对Anticipatory I/O scheduler的 缺点进行改善而来的;

        ④ CFQ I/O schedule:为系统内的所有任务分配相同的带宽, 提供一个公平的工作环境,它比较适合桌面环境

• 12.2 Linux块设备驱动相关数据结构与函数

• 12.2.1 gendisk结构

gendisk(通用磁盘)数据结构:struct gendisk。在Linux内核中,gendisk数据结构表示是一个 独立磁盘设备或者一个分区

– Linux提供了一组函数接口来操作gendisk数据结构:

        ① 分配gendisk

        – structgendisk*alloc_disk(int minors);

         ② 增加(注册)gendisk

        – void add_disk(structgendisk *disk);

        ③ 释放(删除)gendisk

        – void del_gendisk(struct gendisk *gd);

        ④ 引用计数

        减少引用计数:get_disk();

        – 增加引用计数:put_disk();

        ⑤ 设置和查看磁盘容量

        设置磁盘容量:void set_capacity(structgendisk*disk, sector_tsize);

        – 查看磁盘容量:sector_tget_capacity(structgendisk*disk)

 • 12.2.2 request结构

– 块设备的读写都是通过请求实现的。

– 请求数据结构:struct request

 • 12.2.3 request_queue队列

每一个块设备都有一个I/O请求队列

– 请求队列数据结构:struct  request_queue

– 请求队列数据结构包括:

        ① 请求队列的初始化和清除

        ② 提取和删除请求;

        ③ 队列的参数设置

        ④ 内核通告

 • 12.2.4 bio结构

bio(block I/O,块I/O)是Linux内核中通用块层的一个 核心数据结构,它描述了块设备的I/O操作,联系了内 存缓冲区与块设备

– bio是底层对部分块设备的I/O请求描述,其包含驱动程 序执行请求所需的全部信息。

• 12.3 块设备的注册与注销

• 块设备的注册:

        – int register_blkdev(unsigned int major, const char *name);

                • major:主设备号

                • name:设备名

• 块设备的注销

        – int  unregister_blkdev(unsigned int major, const char* name);

                 • major:主设备号

                • name:设备名

• 12.4 块设备初始化与卸载

• 块设备的初始化过程主要完成以下的工作:

        ① 注册块设备块设备驱动程序

        ② 分配、初始化、绑定请求队列(如果使用请求队列的话);

        ③ 分配、初始化gendisk,为相应的成员赋值并添加gendisk;

        ④ 其他初始化工作,如申请缓存区,设置硬件尺寸(不同设备,有不同的处理)。

• 块设备的卸载过程刚好与初始化过程相反:

        ① 删除请求队列;

        ② 撤销gendisk的引用,并删除gendisk;

        ③ 释放缓冲区,撤销对块设备的应用,注销块设备驱动。

• 12.5 块设备操作

块设备操作数据结构:struct block_device_operations

字符设备文件操作数据结构:struct file_operations

 ① 打开和释放

– int(*open) (struct block_device *, fmode_t);

– int(*release) (struct gendisk *, fmode_t);

② I/O操作

– int(*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);

– int(*locked_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);

– int(*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);

③ 介质改变

– int(*media_changed) (struct gendisk *);

④ 使介质有效

– int(*revalidate_disk) (struct gendisk *);

⑤ 获得驱动器信息

– int(*getgeo)(struct block_device *, struct hd_geometry *);

⑥ 模块指针

– struct module *owner;

• 12.6 请求处理

• 块设备没有read和write操作函数。

• 对块设备的读写是通过请求函数完成的。

• 请求处理分为两种情况:

– (1)使用请求队列

        ① 请求函数

        ② 通告内核

        ③ 屏障请求和不可重试请求

– (2)不使用请求队

• 12.7 MMC卡驱动

• 12.7.1 MMC/SD芯片介绍

MMC卡(Multi-Media Card,多媒体卡):1997年由西门子公司和 SanDisk公司共同开发,基于东芝公司的NAND Flash技术。

SD卡(SecureDigital Memory Card,安全数码卡):SD卡是由松下电器、 东芝和SanDisk联合推出,1999年8月发布。– SD卡的数据传送和物理规范由MMC卡发展而来,大小和MMC卡 (32mm×24mm×1.4mm)差不多,尺寸为32mmx24mmx2.1mm,长 宽和MMC卡一样,只是比MMC卡厚了0.7mm,以容纳更大容量的存贮单 元。

 • MMC卡、SD卡的管脚定义

 • Micro SD卡(TF卡)

– Micro SD Card,原名Trans-flash Card(TF卡),2004年正式更名为 Micro SD Card,由SanDisk(闪迪)公司发明,主要用于移动电话。

 • MMC卡的工作模式:

        ① MMC模式:标准的默认模式

        ② SPI模式(Serial Peripheral Interface,串行外设接口 ):用 于只需要小数量的卡(通常是一个)和低数据传输率

• SD卡的工作模式:

        ① SD模式:9根信号线:CLK、CMD、DAT0-DAT3、Vcc (+5V)、Vss(GND)、Css2(GND)。

        ② SPI模式(Serial Peripheral Interface,串行外设接口 ):7 根信号线:CS、CLK、MISO(DATAOUT)、MOSI (DATAIN)、 Vcc(+5V)、Vss(GND)、Css2(GND)。

 • 12.7.2 MMC/SD卡驱动结构

– MMC/SD驱动层次:

        ① 块设备驱动层(drivers/mmc/card):该层实现块设备驱动,为上层提供块 设备的操作功能

        ② MMC/SD核心层(drivers/mmc/core) :该层主要完成MMC/SD规范和协议 的实现。

        ③ MMC/SD接口层(drivers/mmc/host) :该层主要实现Host接口的驱动,并 为上层提供操作接口

– 块设备驱动层、MMC/SD核心层,与具体的硬件平台无关;MMC/SD接口 层根据不同的硬件和不同的控制器有不同的实现。

• 12.7.3 MMC卡块设备驱动分析

– drivers/mmc/card/block.c

– drivers/mmc/card/queue.c

– 主要完成:

        ① 注册与注销

        ② 设备加载与卸载

        ③ 设备的打开与释放

        ④ MMC驱动的请求处理函数

相关文章:

嵌入式系统 第十二讲 块设备和驱动程序设计

• 块设备是Linux三大设备之一(另外两种是字符设备,网络设备),块 设备也是通过/dev下的文件系统节点访问。 • 块设备的数据存储单位是块,块的大小通常为512B至32KB不等。 • 块设备每次能传输一个或多个块&#xff0c…...

攻防世界web第六题upload

这是题目&#xff0c;可以看出是个上传文件的题目&#xff0c;考虑文件上传漏洞&#xff0c;先随便上传一个文件试试&#xff0c;要求上传的是图片。 可以看到上传成功。 考虑用一句话木马解决&#xff0c;构造文件并修改后缀为jpg,然后上传。 <?php eval($_POST[attack])…...

人工智能-Python网络编程-HTTP

用Python创建自己的HTTP服务器 方案一 HTTP-Python官方 python -m http.server 80 方案二 HTTP-概念版 import socketIPV4_ADDR 192.168.124.7 IPV4_PORT 8888# TCP 服务端程序必须绑定端口号&#xff0c;否则客户端找不到这个 TCP 服务端程序 class ServerSocket(obje…...

探索仓颉编程语言:功能、实战与展望

目录 引言 一.使用体验 二.功能剖析 1.丰富的数据类型与控制结构 2.强大的编程范式支持 3.标准库与模块系统 4.并发编程能力 三.实战案例 1.项目背景与目标 2.具体实现步骤 (1).导入必要的模块 (2).发送 HTTP 请求获取网页内容 (3).解析 HTML 页面提取文章信息 (…...

Unity-Editor扩展显示文件夹大小修复版 FileCapacity.cs

实战中是这样的,大项目, 容易定位美术大资产 (原版的代码有问题,每次点运行都会卡顿,大项目20S) //但其实获整个项目内容,1G都没有,有够省的(10年前的中型项目,一直有出DLC) using System; using System.Collections; using System.Collections.Generic; using Sy…...

BLE core 内容整理解释

本文内容比较杂散&#xff0c;只是做记录使用&#xff0c;后续会整理的有条理些 link layer 基本介绍 **Link Layer Control&#xff08;链路层控制&#xff09;**是蓝牙低功耗&#xff08;BLE&#xff09;协议栈的核心部分&#xff0c;负责实现设备间可靠、安全、低功耗的数…...

Linux CPU调度算法

简述 ● CPU数量 < 进程数 ● 每次CPU都要决定下一个运行的进程&#xff0c;这个选择叫做CPU调度&#xff1b;这个选择工作就叫做CPU调度程序 ● 如果一个进程中有多个线程的话&#xff0c;内核管理的线程就以线程为基本单位 ● 进程通常分为两种&#xff0c;一种长时间占…...

Linux套接字通信学习

Linux套接字通信 在网络通信的时候, 程序猿需要负责的应用层数据的处理(最上层)&#xff0c;而底层的数据封装与解封装&#xff08;如TCP/IP协议栈的功能&#xff09;通常由操作系统、网络协议栈或相关网络库&#xff08;如Socket库&#xff09;实现。&#xff08;程序员只需要…...

mybatis-plus 用法总结

MyBatis-Plus&#xff08;简称 MP&#xff09;是 MyBatis 的增强工具&#xff0c;旨在简化开发者的 CRUD 操作。它在 MyBatis 的基础上提供了更多的功能和便利性&#xff0c;如代码生成器、分页插件、性能分析插件等&#xff0c;使开发者能够更高效地进行数据库操作。MyBatis-P…...

小程序配置文件 —— 14 全局配置 - tabbar配置

全局配置 - tabBar配置 tabBar 字段&#xff1a;定义小程序顶部、底部 tab 栏&#xff0c;用以实现页面之间的快速切换&#xff1b;可以通过 tabBar 配置项指定 tab 栏的表现&#xff0c;以及 tab 切换时显示的对应页面&#xff1b; 在上面图中&#xff0c;标注了一些 tabBar …...

Redis-十大数据类型

Reids数据类型指的是value的类型&#xff0c;key都是字符串 redis-server:启动redis服务 redis-cli:进入redis交互式终端 常用的key的操作 redis的命令和参数不区分大小写 &#xff0c;key和value区分 1、查看当前库所有的key keys * 2、判断某个key是否存在 exists key 3、查…...

linux系统编程(七)管道和FIFO

1、管道 使用系统调用pipe可以创建一个新管道&#xff1a; #include <unistd.h> int pipe(int filedes[2]);成功的pipe调用会在数组filedes中返回两个打开的文件描述符&#xff0c;读取端为filedes[0]&#xff0c;写入端为filedes[1]。我们可以使用read/write系统调用在…...

【vLLM大模型TPS测试三部曲】

安装 pip install vllm模型自行下载 例如: https://modelscope.cn/models/jackle/Qwen2.5-Coder-32B-GPTQ-Int4/ 部署测试 export VLLM_MODELQwen2.5-Coder-32B-GPTQ-Int4 # 启动 python3 -m vllm.entrypoints.openai.api_server --model $VLLM_MODEL --deviceauto --enf…...

Elasticsearch:使用 Ollama 和 Go 开发 RAG 应用程序

作者&#xff1a;来自 Elastic Gustavo Llermaly 使用 Ollama 通过 Go 创建 RAG 应用程序来利用本地模型。 关于各种开放模型&#xff0c;有很多话要说。其中一些被称为 Mixtral 系列&#xff0c;各种规模都有&#xff0c;而一种可能不太为人所知的是 openbiollm&#xff0c;这…...

Windows平台ROBOT安装

Windows环境下ROBOT的安装,按照下文进行部署ROBOT的前提是你的python已安装并且环境变量已设置好. 一、安装setuptools 1、下载后安装 https://pypi.python.org/pypi/setuptools/ 下载你需要的包 setuptools-75.6.0.tar.gz 解压下载的包在命令行中进入该包,敲击如下命令后…...

【动态规划篇】穿越算法迷雾:约瑟夫环问题的奇幻密码

欢迎拜访&#xff1a;羑悻的小杀马特.-CSDN博客 本篇主题&#xff1a;带你众人皆知的约瑟夫环问题 制作日期&#xff1a;2024.12.29 隶属专栏&#xff1a;C/C题海汇总 目录 引言&#xff1a; 一约瑟夫环问题介绍&#xff1a; 11问题介绍&#xff1a; 1.2起源与历史背景&…...

代码随想录算法训练营第51期第32天 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

理论基础 动态规划&#xff1a;dp&#xff0c;每一个状态都是由上个状态推导出来的&#xff0c;因为我是先写完三道题再看理论的&#xff0c;所以有点感概&#xff1b; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举…...

爱思唯尔word模板

爱思唯尔word模板 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 参考文献书签链接...

每日一题 354. 俄罗斯套娃信封问题

354. 俄罗斯套娃信封问题 需要对信封排序 ,重点是再宽度相同时&#xff0c;逐步减少其高度 class Solution { public:int maxEnvelopes(vector<vector<int>>& envelopes) {sort(envelopes.begin(),envelopes.end(),[](const vector<int>&a,const v…...

ASP.net网站的注册、登录和密码修改的操作详解

一、进入注册、登录和密码修改操作详解 ASP.net网站为用户提供不同权限状态下的操作界面。根据用户登录状态&#xff0c;页面会显示不同的选项。 已登录用户的操作 图1 登录后操作界面 当用户已登录系统时&#xff0c;会显示以下内容和功能&#xff1a; 1. 欢迎信息 页面顶部…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

Windows 下端口占用排查与释放全攻略

Windows 下端口占用排查与释放全攻略​ 在开发和运维过程中&#xff0c;经常会遇到端口被占用的问题&#xff08;如 8080、3306 等常用端口&#xff09;。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口&#xff0c;帮助你高效解决此类问题。​ 一、准…...

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...

数据可视化交互

目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 一、安装 pyecharts 二、下载数据 三、实验任务 实验 1&#xff1a;AQI 横向对比条形图 代码说明&#xff1a; 运行结果&#xff1a; 实验 2&#xff1a;AQI 等级分布饼图 实验 3&#xff1a;多城市 AQI…...

ai流式文字返回前端和php的处理办法

PHP后端 php端主要是用到ob_flush和flush&#xff0c;头改为流式。 基本代码 代码如下&#xff1a; <?php header(Content-Type:text/event-stream); header(Cache-Control:no-cache); header(Connection:keep-alive);function streamPostRequest($url,$data){$chcurl_…...