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

深入理解 Linux 中磁盘空间驱动的编写:从原理到实践

在编写 Linux 内核中的磁盘空间驱动时,理解不同类型的存储设备及其在内核中的工作模式至关重要。常见的存储设备主要分为两类:采用 MTD(Memory Technology Device)模式的原始闪存设备(如 NAND、NOR Flash),以及使用块设备模式(Block Device Mode)的存储设备(如 eMMC、SD 卡、U 盘、SATA 硬盘等)。

本篇博文将围绕磁盘空间驱动的核心编写逻辑,结合实际设备类型,对比分析 MTD 与块设备的差异,并深入讲解 eMMC 所处的工作模式与其对驱动开发的影响。

在这里插入图片描述


一、磁盘设备的两种主要模式

1.1 MTD 模式(Memory Technology Device)

MTD 模式主要面向原始闪存设备,例如 NAND 和 NOR Flash。这类设备没有自带的 Flash 管理控制器,所有的擦除、写入对齐、坏块处理、磨损均衡等都需要依赖软件层完成。

在内核中,MTD 子系统由 drivers/mtd/ 提供支持,相关设备节点表现为:

  • /dev/mtdX:字符设备接口,用于直接访问底层 Flash;
  • /dev/mtdblockX:块设备封装接口,供文件系统挂载使用;

MTD 设备通常使用专门设计的 Flash 文件系统(如 JFFS2、UBIFS),并由用户空间工具(如 flash_erasenandwrite)进行数据擦写操作。

1.2 块设备模式(Block Device Mode)

块设备模式适用于那些自带控制器并对外屏蔽物理细节的存储设备,例如 eMMC、SD 卡、U 盘、NVMe 和传统机械硬盘等。这类设备对上层操作系统暴露为标准的块设备接口,表现为:

  • /dev/mmcblk0/dev/sda/dev/nvme0n1 等;
  • 可直接格式化为 ext4、f2fs、vfat 等文件系统;
  • 通过标准工具(如 mkfs.ext4fsckmount)进行日常管理;

块设备由内核中的不同子系统管理,如:

  • MMC 设备由 drivers/mmc/ 支持;
  • NVMe 由 drivers/nvme/ 管理;
  • USB 存储由 drivers/usb/storage/ 实现。

二、eMMC 所处的模式:标准块设备

eMMC(embedded MultiMediaCard)是一种广泛应用于移动设备、工控平台、嵌入式主板的嵌入式存储器,其本质是一颗集成了 NAND Flash 与 Flash 控制器的单芯片设备。

2.1 eMMC 的硬件特性

  • 内置 Flash Translation Layer (FTL),自动完成逻辑块与物理页映射、坏块管理、磨损均衡;
  • 对主机(即 SoC/CPU)完全屏蔽 Flash 原始操作的复杂性;
  • 支持标准命令接口(如 JEDEC eMMC 规范定义的命令集)。

2.2 eMMC 在 Linux 中的表现

在 Linux 内核中,eMMC 通过 MMC 子系统进行管理,对系统暴露为标准的块设备节点,例如:

  • /dev/mmcblk0:代表 eMMC 设备本体;
  • /dev/mmcblk0p1/dev/mmcblk0p2:其上划分的分区设备;

eMMC 不属于 MTD 设备,因此:

  • 不会出现在 /proc/mtd 中;
  • 不支持 mtd-utils 提供的低级擦写工具;
  • 可直接格式化为 ext4、f2fs 等标准文件系统进行挂载;

三、MTD 与块设备模式对比分析

特性MTD 模式块设备模式(eMMC 所在)
典型设备原始 NAND Flash、SPI NOR FlasheMMC、SD 卡、U 盘、SATA 硬盘等
内核驱动子系统drivers/mtd/drivers/mmc/
设备节点/dev/mtdX/dev/mtdblockX/dev/mmcblk0/dev/sda
是否需软件 FTL 支持是,需借助文件系统层(如 UBIFS)否,硬件自带 FTL
支持的文件系统JFFS2、UBIFSext4、f2fs、vfat 等
是否出现在 /proc/mtd
用户空间工具支持mtd-utils(如 flash_erase, nandwrite标准工具链(如 mkfs.ext4, mount

此外,访问粒度与写入机制 是两种模式的核心本质区别:

MTD 模式强调原始字节访问能力,但受限于 Flash 本身的页/块结构,写入前必须擦除,需自行管理坏块与磨损问题。

块设备模式则以标准扇区为单位访问,底层细节由设备控制器屏蔽,使用体验更贴近传统磁盘。

换句话说:

MTD 模式:你必须“管理 Flash”。
Block 模式:你只需“使用存储”。

这也决定了两类设备在驱动编写上的出发点和工作重心完全不同。


四、驱动开发者该如何选择接口?

在开发 Linux 磁盘空间驱动时,关键在于识别目标设备所处的模式:

  • 若为原始 NAND/NOR Flash,则需使用 MTD 接口,支持特定 Flash 文件系统,且要考虑擦除、对齐、坏块等底层细节;
  • 若为 eMMC、U 盘、SD 卡等设备,应使用标准块设备框架,系统已为你屏蔽物理细节,驱动重点转向注册设备、分区识别和文件系统集成。

五、总结与后续方向

eMMC 是一种自带控制器的闪存设备,它不属于 MTD 设备,而是在 Linux 内核中作为标准块设备管理。开发者在处理存储驱动时,应根据设备特性选择对应接口框架。

本篇博文从内核驱动视角出发,梳理了磁盘空间驱动所涉及的两大工作模式,并结合 eMMC 的具体特性进行了深入分析。后续章节将围绕块设备驱动注册流程、分区处理、读写调度及文件系统挂载机制展开更深入的探讨,为驱动开发打下坚实基础。

相关文章:

深入理解 Linux 中磁盘空间驱动的编写:从原理到实践

在编写 Linux 内核中的磁盘空间驱动时,理解不同类型的存储设备及其在内核中的工作模式至关重要。常见的存储设备主要分为两类:采用 MTD(Memory Technology Device)模式的原始闪存设备(如 NAND、NOR Flash)&…...

flutter android端抓包工具

flutter做的android app,使用fiddler抓不了包,现介绍一款能支持flutter的抓包工具Reqable,使用方法如下: 1、下载电脑端安装包 下载地址为【https://reqable.com/zh-CN/download/】 2、还是在上述地址下载 android 端apk&#xf…...

知识周汇 | 用 matplotlib 轻松绘制折线图、散点图、柱状图、直方图

目录 前言 折线图 散点图 柱状图 直方图 组合图:柱状图和折线图 1. 导入库 2. 定义组合图函数 3. 设置中文字体和样式 4. 创建画布和子图 5. 绘制柱状图 6. 绘制折线图 7. 美化图表 8. 保存和显示图表 9. 调用函数 总结 前言 matplotlib 是 Python…...

Ribbon负载均衡的深度解析与应用

在微服务架构中,服务之间的调用频繁且复杂,因此负载均衡显得尤为重要。Spring Cloud生态系统中,Ribbon作为一个客户端负载均衡器,扮演着关键的角色。它不仅能提高系统的响应速度,还能确保系统的稳定性和可用性。接下来…...

Neo4j GDS-06-neo4j GDS 库中社区检测算法介绍

neo4j apoc 系列 Neo4j APOC-01-图数据库 apoc 插件介绍 Neo4j APOC-01-图数据库 apoc 插件安装 neo4j on windows10 Neo4j APOC-03-图数据库 apoc 实战使用使用 Neo4j APOC-04-图数据库 apoc 实战使用使用 apoc.path.spanningTree 最小生成树 Neo4j APOC-05-图数据库 apo…...

Android 删除aar中的一个类 aar包冲突 aar类冲突 删除aar中的一个包

Duplicate class com.xxxa.naviauto.sdk.listener.OnChangeListener found in modules jetified-xxxa-sdk-v1.1.2-release-runtime (:xxx-sdk-v1.1.2-release:) and jetified-xxxb-sdk-1.1.3-runtime (:xxxb-sdk-1.1.3:) A.aar B.aar 有类冲突; 使用 exclude 排除本…...

【老电脑翻新】华硕A456U(换电池+换固态+光驱换机械+重装系统+重装系统后开始菜单失灵问题解决)

前言 电脑华硕A456U买来快10年了,倒是还能用,就是比较卡,cpu占比总是100%,之前已经加过内存条了。想要不换个固态看看。 省流:没太大效果。 记录一下拆机&换固态的过程 准备 西部数据固态硬盘480G WD Green S…...

Unity 简单使用Addressables加载SpriteAtlas图集资源

思路很简单,传入图集名和资源名,利用Addressables提供的异步加载方式从ab包中加载。加载完成后存储进缓存字典里,以供后续使用。 添加引用计数,防止多个地方使用同一图集时,不会提前释放 using UnityEngine; using U…...

stable diffusion本地安装

1. 基本环境准备 安装conda 环境 pytorch基础学习-CSDN博客 创建虚拟环境: conda create -n sd python3.10 一定要指定用3.10,过高的版本会提示错误: 激活启用环境: conda activate sd 设置pip国内镜像源: pip conf…...

MQ 如何保证数据一致性?

大家好,我是苏三,又跟大家见面了。 前言 上个月,我们有个电商系统出了个灵异事件:用户支付成功了,但订单状态死活不改成“已发货”。 折腾了半天才定位到问题:订单服务的MQ消息,像人间蒸发一…...

spring @Autowired对属性、set方法,构造器的分别使用,以及配合 @Autowired 和 @Qualifier避免歧义性的综合使用案例

代码结构 依赖注入 在Spring IoC容器的概念中,主要是使用依赖注入来实现Bean之间的依赖关系的 举例 例如,人类(Person)有时候会利用动物(Animal)来完成一些事情,狗(Dog&#xff0…...

Ubuntu 系统上完全卸载 Docker

以下是在 Ubuntu 系统上完全卸载 Docker 的分步指南 一.卸载验证 二.卸载步骤 1.停止 Docker 服务 sudo systemctl stop docker.socket sudo systemctl stop docker.service2.卸载 Docker 软件包 # 移除 Docker 核心组件 sudo apt-get purge -y \docker-ce \docker-ce-cli …...

国际机构Gartner发布2025年网络安全趋势

转自:中国新闻网 中新网北京3月14日电 国际机构高德纳(Gartner)14日发布的消息称,网络安全和风险管理在2025年“面临挑战与机遇并存的局面”,“实现转型和提高弹性”对确保企业在快速变化的数字世界中,实现安全且可持续的创新至关…...

设计秒杀系统(高并发的分布式系统)

学海无涯,志当存远。燃心砺志,奋进不辍。 愿诸君得此鸡汤,如沐春风,事业有成。 若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌! 思路 处理高并发 流量削峰:限流&#xf…...

C# 打印模板设计-ACTIVEX打印控件-多模板加载

一、启动软件 using System; using System.Collections.Generic; using System.Windows.Forms; using System.Data;namespace Print {static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(){//使用模板前必须…...

华为HCIE方向那么多应该如何选择?

在华为认证体系里&#xff0c;HCIE作为最高等级的认证&#xff0c;是ICT领域专业实力的有力象征。HCIE设置了多个细分方向&#xff0c;这些方向宛如不同的专业赛道&#xff0c;为期望在ICT行业深入发展的人提供了丰富的选择。今天&#xff0c;咱们就来好好聊聊华为HCIE方向的相…...

五子棋游戏

五子棋 - deveco <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>五子棋 - deveco</title>…...

Vue3.5 企业级管理系统实战(十):面包屑导航组件

1 breadcrumb 组件 1.1 安装插件 path-to-regexp 首先&#xff0c;我们需要安装插件 path-to-regexp&#xff0c;以便在下面的面包屑组件中对路由地址进行解析。 path-to-regexp是一个 JavaScript 库&#xff0c;可将路径字符串转化为正则表达式&#xff0c;广泛用于 Web 开发…...

【python】OpenCV—Hand Detection

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、参考6、其它手部检测和手势识别的方案 更多有趣的代码示例&#xff0c;可参考【Programming】 1、功能描述 基于 opencv-python 和 mediapipe 进行手部检测 2、代码实现 导入必要的库函数 import cv2 import media…...

[ComfyUI] SDXL Prompt Styler 自定义节点的作用解析

1. SDXL Prompt Styler 的位置与基本功能 在 ComfyUI 的 “新建节点” → “实用工具” 下,可以找到 Style 节点(SDXL Prompt Styler)。该节点的主要作用是对输入的描述进行结构化处理,并在转换为 Stable Diffusion XL (SDXL) 提示词时,自动补充风格相关的内容,使提示词…...

Oracle-rman restore遭遇RMAN-03002与ORA-19563

文章目录 在原DB上检查是否有重复的文件名&#xff1a;查看rman恢复的日志修正重名部分重新执行rman恢复结论&#xff1a; 在 RMAN 恢复过程中&#xff0c;遇到RMAN-03002连同ORA-19563:错误。 操作是将 Oracle 10.0.5的数据库备份从 RMAN備份恢复到另一台测试主机的同一个目录…...

FPGA中串行执行方式之使用时钟分频或延迟的方式

FPGA中串行执行方式之使用时钟分频或延迟的方式 在FPGA设计中,​时钟分频和延迟是两种常用的技术,用于控制信号的时序或调整信号的频率。它们可以用来实现简单的串行逻辑、状态转移或其他需要时间控制的场景。 时钟分频(Clock Division) 基本原理:时钟分频是通过将输入…...

Dubbo 全面解析:从 RPC 核心到服务治理实践

一、分布式系统与 RPC 框架概述 在当今互联网时代&#xff0c;随着业务规模的不断扩大&#xff0c;单体架构已经无法满足高并发、高可用的需求&#xff0c;分布式系统架构成为主流选择。而在分布式系统中&#xff0c;远程服务调用&#xff08;Remote Procedure Call&#xff0…...

JavaScript 调试入门指南

JavaScript 调试入门指南 一、调试准备阶段 1. 必备工具配置 浏览器套件:安装最新Chrome102+,开启实验性功能(地址栏输入chrome://flags/#enable-devtools-experiments)编辑器集成:VS Code安装以下扩展: JavaScript Debugger:支持浏览器与Node.js双端调试Error Lens:实…...

不能将下载行为传输到IDM

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 安装IDM后&#xff0c;调用IDM下载软件显示&#xff1a;不能将下载行为传输到IDM&#xff0c;Error 0x80029C4A 二、原因分析 可能是识别浏览器插件不到&#xff0c;或者本地的插件版本不对导致的 三…...

spring security 认证流程分析

Spring Security 认证流程分析 Spring Security 的认证流程是一个模块化且可扩展的过程&#xff0c;核心围绕 过滤器链 和 认证组件 协作实现。以下是详细流程分析&#xff1a; 1. 请求拦截与过滤器链 • 入口&#xff1a;所有 HTTP 请求经过 Spring Security 的过滤器链。 •…...

Docker Compose 部署 Loki

官方文档&#xff1a;https://grafana.com/docs/loki/latest/setup/install/docker/ 环境准备 安装 Docker和Docker Compose 参考&#xff1a;https://qiangsh.blog.csdn.net/article/details/125375187 创建loki目录 mkdir -p /opt/loki/config mkdir -p /data/monitoring…...

nuxt3 seo优化

在 Nuxt3 中&#xff0c;通过 nuxtjs/seo、nuxtjs/sitemap 和 nuxtjs/robots 模块可以生成包含动态链接的站点地图&#xff08;sitemap.xml&#xff09;&#xff0c;但具体是“实时生成”还是“部署时生成”&#xff0c;取决于你的配置方式和数据更新频率。以下是具体分析&…...

CentOS 8 Stream 配置在线yum源参考 —— 筑梦之路

CentOS 8 Stream ISO 文件下载地址&#xff1a;http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_64/CentOS-Stream-8-20240603.0-x86_64-dvd1.isoCentOS 8 Stream 网络引导ISO 文件下载地址&#xff1a;http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_6…...

uniapp 在app上 字体如何不跟着系统字体大小变

在UniApp开发中&#xff0c;默认情况下App的字体可能会跟随系统字体设置而变化。如果你希望保持固定的字体样式&#xff0c;不随系统字体设置改变&#xff0c;可以采用以下几种方法&#xff1a; 方法一&#xff1a;全局CSS设置 在App.vue的样式中添加以下CSS&#xff1a; /*…...

leetcode141.环形链表

直接快慢指针&#xff0c;如果有环&#xff0c;那么快指针一定会在成环的起始点与慢指针相遇 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ pu…...

【HTML5游戏开发教程】零基础入门合成大西瓜游戏实战 | JS物理引擎+Canvas动画+完整源码详解

《从咖啡杯到财务自由&#xff1a;一个程序员的合成之旅——当代码遇上物理引擎的匠心之作》 &#x1f31f; 这是小游戏开发系列的第四篇送福利文章&#xff0c;感谢一路以来支持和关注这个项目的每一位朋友&#xff01; &#x1f4a1; 文章力求严谨&#xff0c;但难免有疏漏之…...

【C#语言】深入理解C#多线程编程:从基础到高性能实践

文章目录 ⭐前言⭐一、多线程的本质价值&#x1f31f;1、现代计算需求&#x1f31f;2、C#线程演进史 ⭐二、线程实现方案对比&#x1f31f;1、传统线程模型&#x1f31f;2、现代任务模型&#xff08;推荐&#xff09;&#x1f31f;3、异步编程范式 ⭐三、线程安全深度解析&…...

短信验证码安全需求设计

背景&#xff1a; 近期发现部分系统再短信充值频繁&#xff0c;发现存在恶意消耗短信额度现象&#xff0c;数据库表排查&#xff0c;发现大量非合法用户非法调用短信接口API导致额度耗尽。由于系统当初设计存在安全缺陷&#xff0c;故被不法分子进行利用&#xff0c;造成损失。…...

selenium实现自动登录项目(5)

1、163邮箱自动登录功能 遇到的问题&#xff1a; 1、登录页面&#xff0c;在定位表单时候&#xff0c;采用id&#xff0c;xpath&#xff0c;css selector都无法定位成功&#xff0c;因为id后面有个随机生成的数字&#xff08;//*[id"x-URS-iframe1741925838640.6785&quo…...

多 线 程

一.基本知识 线程&#xff1a;线程是操作系统能够运行调度的最小单位 进程&#xff1a;进程是程序执行实体 多线程应用场景&#xff1a;拷贝、迁移大文件&#xff0c;加载大量的资源文件 并发&#xff1a;有多个指令在单个cpu上交替执行 并行&#xff1a;在同一时刻人&…...

C#:类型定义中使用‌问号(?)

在 C# 中&#xff0c;类型定义中的‌问号&#xff08;?&#xff09;‌主要用于控制类型的可空性&#xff0c;但具体行为因类型&#xff08;值类型或引用类型&#xff09;和 C# 版本而异。以下是清晰分类的说明&#xff1a; 一、可空值类型&#xff08;T?&#xff0c;适用于所…...

基于飞腾FT2000+服务器主板与DeepSeek大模型的国产化AI算力探索

随着国产化处理器和AI技术的快速发展&#xff0c;自主可控的算力解决方案日益受到关注。国内大模型技术飞速发展&#xff0c;Deepseek等大模型在自然语言处理、计算机视觉等领域展现出强大的能力。面对大模型的计算需求&#xff0c;服务器硬件的国产化成为重要趋势。 飞腾FT20…...

知识篇 | Oracle的 TEMP表空间管理和优化

Oracle临时表空间&#xff08;TEMP&#xff09;是数据库中用于存储会话级临时数据的核心组件&#xff0c;主要用于支持需要中间结果集的操作&#xff08;如排序、哈希连接&#xff09;。其数据在事务结束或会话终止后自动释放&#xff0c;不持久化存储。 核心特点&#xff1a;…...

鸿蒙进行视频上传,使用 request.uploadFile方法

一.拉起选择器进行视频选择&#xff0c;并且创建文件名称 async getPictureFromAlbum() {// 拉起相册&#xff0c;选择图片let PhotoSelectOptions new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType photoAccessHelper.PhotoViewMIMETypes.VIDEO_TY…...

如何下载 Postman?快速指南!

Postman 是一款非常受欢迎的 API 测试工具。它最初是作为一个 Chrome 插件发布&#xff0c;后来发展成为一款独立的跨平台软件&#xff0c;支持 Windows、Mac、Linux 等操作系统。 Postman 怎么下载教程&#xff08;2025最新版&#xff09;&#xff1f;...

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一个常见的 UI 组件&#xff0c;用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本&#xff0c;所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…...

M系mac怎么关闭sip

SIP是系统级的权限操作&#xff0c;我们无法直接关闭它。记录一下如何成功关闭SIP。 一. 查看自己mac的sip是否关闭&#xff0c;终端中输入该下命令&#xff1a; csrutil status 未关闭&#xff1a;System Integrity Protection status: enabled. 已关闭&#xff1a;System…...

Kafka 的延迟队列、死信队列和重试队列

总结一下实现的方法&#xff1a; 1、延迟队列&#xff0c;首先kafka是没有延迟队列的&#xff0c;那要实现延迟队列的话&#xff0c;就得使用其他方法。在发送消息的时候加上时间戳&#xff0c;再在时间戳上面加上延迟时间。消费的时候判断一下&#xff0c;有没有到达延迟时间&…...

OpenCV正确安装及环境变量配置

安装OpenCV&#xff08;v4.6.0&#xff09;安装Python&#xff08;3.10.6&#xff09;安装VS2022的C桌面开发&#xff0c;手动勾选Windows 10 SDK和MSVC安装CMake&#xff08;3.31.6&#xff09;在.npmrc配置pnpm config set auto-approve-builds true运行pnpm install 接下来是…...

分布式系统的CAP理论、事务和锁实现

分布式系统核心概念 1. CAP理论 CAP理论指出&#xff0c;分布式系统最多同时满足以下三项中的两项&#xff1a; 一致性&#xff08;CC&#xff09;&#xff1a;所有节点访问同一份最新数据。可用性&#xff08;AA&#xff09;&#xff1a;每个请求都能在合理时间内获得非错误…...

JBDev - Theos下一代越狱开发工具

JBDev - Theos下一代越狱开发工具 自越狱诞生以来&#xff0c;Theos一直是越狱开发的主流工具&#xff0c;大多数开发者使用Theos编译代码&#xff0c;再用lldb手动调试。JBDev简化了这个过程&#xff0c;项目地址https://github.com/lich4/JBDev 简介 JBDev用于Xcode越狱开…...

vue3自定义动态锚点列表,实现本页面锚点跳转效果

需求&#xff1a;当前页面存在多个模块且内容很长时&#xff0c;需要提供一个锚点列表&#xff0c;可以快速查看对应模块内容 实现步骤&#xff1a; 1.每个模块添加唯一id&#xff0c;添加锚点列表div <template><!-- 模块A --><div id"modalA">…...

华为、浪潮、华三链路聚合概述

1、华为 链路聚合可以提高链路带宽和链路冗余性。有三种类型&#xff0c;分别是手工链路聚合&#xff0c;静态lacp链路聚合&#xff0c;动态lacp链路聚合。 手工链路模式&#xff1a;也称负载分担模式&#xff0c;需手动指定链路&#xff0c;各链路之间平均分担流量。静态LAC…...

RUBY报告系统

我们常用GFP及其变体如RFP、YFP、mCherry等作为基因表达的报告蛋白——需要荧光显微镜制片观察&#xff1b;此外还有GUS或荧光素酶作为报告酶——需要添加底物。 RUBY报告系统则与众不同&#xff0c;其作用原理是&#xff1a;将酪氨酸转化为鲜艳的红色甜菜碱&#xff0c;无需使…...