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

深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*

目录

  • 前言
  • 一、什么是MTD子系统?
  • 二、 `/dev/mtd*` 设备文件
      • 用途
      • 注意事项
  • 三、`/dev/mtdblock*` 设备文件
      • 用途
      • 注意事项
  • 三、这两种设备文件的关系
  • 四、关norflash的一些小知识

前言

  在嵌入式Linux系统的世界里,非易失性存储技术扮演着至关重要的角色。MTD(Memory Technology Device)子系统是Linux内核的一个组成部分,它为各种类型的闪存和EEPROM设备提供了一个统一的接口。本文将深入探讨Linux系统中的两种MTD设备文件:/dev/mtd*/dev/mtdblock*,它们的用途、区别以及如何在实际场景中应用这些知识。
在这里插入图片描述

一、什么是MTD子系统?

  MTD(Memory Technology Device)子系统是 Linux 内核中的一个子系统,用于管理非易失性存储器设备,如闪存芯片(NAND、NOR 等)。MTD 子系统提供了一组通用的接口和驱动程序,使得 Linux 能够方便地访问和操作这些存储设备。

  MTD 子系统的主要功能包括:

  1. 设备抽象和管理:MTD 子系统提供了一个设备抽象层,允许系统对不同类型的非易失性存储设备进行统一的管理。它提供了一种通用的方式来表示和操作这些设备,无论它们是基于 NAND、NOR 还是其他技术。

  2. 设备擦除和编程:MTD 子系统允许 Linux 内核对支持擦除和编程操作的存储设备执行这些操作。这对于闪存等设备是至关重要的,因为它们通常需要在写入新数据之前先擦除存储单元。

  3. 分区支持:MTD 子系统允许将存储设备划分为多个逻辑分区,每个分区可以独立管理。这使得在同一个物理设备上实现多个逻辑存储空间成为可能,可以用于实现文件系统、内核映像等。

  4. 驱动程序支持:MTD 子系统提供了一组通用的驱动程序接口,使得开发者可以编写适配不同类型存储设备的驱动程序,并将其与 MTD 子系统集成起来。

总的来说,MTD 子系统为 Linux 内核提供了与非易失性存储设备交互的标准接口,使得开发者可以更方便地实现对这些设备的管理、操作和访问。

二、 /dev/mtd* 设备文件

  /dev/mtd*设备文件是MTD子系统的核心组成部分。这些文件代表了系统中的MTD设备,通常用于访问小块的、页对齐的内存区域。每个/dev/mtd*设备文件都有一个数字后缀,例如/dev/mtd0/dev/mtd1等,这些数字代表了设备在系统中的索引。

用途

  • 系统更新/dev/mtd*设备常用于更新系统的引导加载程序(bootloader)和内核。在嵌入式系统中,这些组件通常存储在闪存设备上,需要通过MTD子系统进行更新。
  • 数据存储:某些系统可能会使用MTD设备来存储关键的数据,如U-Boot环境变量或其他系统配置信息。
  • 设备测试:开发者可以使用/dev/mtd*设备文件来测试闪存设备的读写性能和可靠性。

注意事项

  • 访问/dev/mtd*设备文件通常需要root权限。
  • 由于MTD设备通常用于存储关键的系统数据,因此在对其进行操作时需要格外小心,以避免数据丢失或系统损坏。

三、/dev/mtdblock* 设备文件

/dev/mtd*不同,/dev/mtdblock*设备文件提供了对MTD设备的块设备接口。这意味着它们可以被挂载为文件系统,并以块为单位进行读写操作。/dev/mtdblock*设备文件的命名方式与/dev/mtd*类似,也使用数字后缀来区分不同的设备。

用途

  • 文件系统挂载/dev/mtdblock*设备文件可以挂载为文件系统,用于存储操作系统、应用程序或用户数据。这对于没有传统硬盘驱动器的嵌入式设备尤其有用。
  • 数据分区:通过使用/dev/mtdblock*设备,开发者可以在闪存设备上创建多个分区,每个分区可以独立地挂载和管理。
  • 系统恢复:在系统崩溃或损坏的情况下,/dev/mtdblock*设备可以用于恢复系统镜像或重要的配置文件。

注意事项

  • 在对/dev/mtdblock*设备进行写操作之前,应确保没有任何文件系统挂载在其上。
  • /dev/mtd*一样,访问/dev/mtdblock*设备文件也需要root权限。

三、这两种设备文件的关系

  这些不同的设备文件通常对应同一块存储区域。比如在使用 NOR Flash 存储器时,不同的设备文件只是提供了不同的访问方式和操作权限,但是它们对应的确实是同一个物理空间或逻辑分区。

  举例来说,当你在一个嵌入式系统中使用 NOR Flash 存储器时,可能会看到 /dev/mtd0/dev/mtdblock0/dev/mtd0ro 这几个设备文件,它们对应的都是 NOR Flash 存储器中的同一个物理空间或逻辑分区。其中 /dev/mtd0/dev/mtdblock0 提供了不同的读写方式,/dev/mtd0ro 则是只读的。这些设备文件允许用户以不同的方式与 NOR Flash 存储器进行交互和访问,例如可以进行烧写、读取和执行代码等操作。

  因此,无论是块设备文件还是字符设备文件,以及只读设备文件,它们都可以对应同一块存储区域或相同的物理空间。区别在于它们提供了不同的权限和访问方式,以满足不同的使用需求。

四、关norflash的一些小知识

  在 NOR Flash 存储器中,一个 block 的大小通常是 64KB(64 * 1024 字节)。这个 block 大小是 NOR Flash 存储器常见的值,但实际上在不同型号的 NOR Flash 存储器中,block 的大小可能会有所不同。因此,在具体使用时,需要查阅相关的数据手册或规格说明来确认所使用的 NOR Flash 存储器 block 的确切大小。

  对于 NOR Flash 存储器来说,通常是在对其进行写操作之前需要先擦除。这是因为 NOR Flash 存储器中的存储单元(如字节或扇区)在执行写操作时,是将数据从逻辑值 1 写入逻辑值 0,因此需要先将要写入的存储单元擦除为逻辑值 1,然后再写入新的数据。

  具体来说,擦除操作会将存储单元的数据全部置为逻辑值 1,而写操作则是将特定的存储单元从逻辑值 1 写入为逻辑值 0。如果在进行写操作时不进行擦除,那么由于 NOR Flash 存储器一般不支持原地写入(in-place write),可能会导致写入的数据无法正确覆盖之前的数据,从而产生错误数据或不稳定的状态。

  因此,为了确保 NOR Flash 存储器中数据的正确性和稳定性,通常在进行写操作之前需要先执行擦除操作。在擦除操作和写操作过程中,还需要注意避免中断电等意外情况,以确保数据的完整性和一致性。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/mtd/mtd.h>
#include <linux/mtddll.h>#define MTD_DEVICE_0 "/dev/mtd0"
#define MTD_DEVICE_1 "/dev/mtd1"int main() {int mtd0_fd, mtd1_fd;struct mtd_info_user mtd_info;struct erase_info_user erase_info;ssize_t bytes_read, bytes_written;char buffer[4096]; // 读取/写入的缓冲区大小// 打开第一个MTD设备进行读取if ((mtd0_fd = open(MTD_DEVICE_0, O_RDONLY)) < 0) {perror("Error opening MTD device 0");return EXIT_FAILURE;}// 获取MTD设备信息if (ioctl(mtd0_fd, MEMGETINFO, &mtd_info) < 0) {perror("Error getting MTD device information");close(mtd0_fd);return EXIT_FAILURE;}// 打开第二个MTD设备进行写入if ((mtd1_fd = open(MTD_DEVICE_1, O_WRONLY)) < 0) {perror("Error opening MTD device 1");close(mtd0_fd);return EXIT_FAILURE;}// 擦除第二个MTD设备的相关块for (int i = 0; i < mtd_info.eraseblocks; i++) {erase_info.start = i * mtd_info.erasesize;erase_info.length = mtd_info.erasesize;if (ioctl(mtd1_fd, MEMERASE, &erase_info) < 0) {perror("Error erasing MTD device 1");close(mtd0_fd);close(mtd1_fd);return EXIT_FAILURE;}}// 从第一个MTD设备读取数据while ((bytes_read = read(mtd0_fd, buffer, sizeof(buffer))) > 0) {// 将数据写入第二个MTD设备bytes_written = write(mtd1_fd, buffer, bytes_read);if (bytes_written != bytes_read) {perror("Error writing to MTD device 1");close(mtd0_fd);close(mtd1_fd);return EXIT_FAILURE;}}// 关闭MTD设备文件描述符close(mtd0_fd);close(mtd1_fd);printf("Data transfer from MTD device 0 to MTD device 1 completed successfully.\n");return EXIT_SUCCESS;
}

  在这个示例中,我们使用MEMERASEioctl调用来擦除/dev/mtd1设备上的每个擦除块。erase_info_user结构体被用来指定要擦除的块的起始地址和长度。这个操作通常比读取和写入操作慢,因此在实际应用中,您可能希望优化这个过程,例如通过并行擦除或使用更高效的写入策略。

  请记住,擦除操作是破坏性的,因此在执行之前应该确保数据已经备份。此外,确保您有足够的权限来执行这些操作,通常需要root权限。在实际部署之前,应该在受控环境中彻底测试代码,以避免数据丢失。

/*
BLKGETSIZE64 用于获取块设备的大小(以字节为单位),返回的值是一个 unsigned long long 类型
的整数,表示设备的总容量。这个命令通常用于获取大于 2 TB 的设备大小,因为 BLKGETSIZE 在 32 
位系统上可能会出现溢出问题。BLKGETSIZE 用于获取块设备的大小(以扇区为单位),返回的值是一个 long 类型的整数,表示设备
的总扇区数。通常情况下,这个命令可以满足大多数小于 2 TB 的设备大小获取需求。
*/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>#define MTD_BLOCK_DEVICE "/dev/mtdblock0"int main() {int fd;unsigned long long erase_size, total_size;unsigned int erase_flags = 0; // 通常为0,表示默认擦除选项// 打开MTD块设备进行读写if ((fd = open(MTD_BLOCK_DEVICE, O_RDWR)) < 0) {perror("Error opening MTD block device");return EXIT_FAILURE;}// 获取MTD块设备的擦除大小和总大小if (ioctl(fd, BLKGETSIZE64, &total_size) != 0) {perror("Error getting device size");close(fd);return EXIT_FAILURE;}erase_size = total_size; // 假设整个设备需要擦除// 擦除MTD块设备if (ioctl(fd, BLKERASE, &erase_size) != 0) {perror("Error erasing MTD block device");close(fd);return EXIT_FAILURE;}// 准备要写入的数据const char *data_to_write = "This is a test.\n";size_t data_len = strlen(data_to_write) + 1; // 加1是为了包括字符串的终止符'\0'// 从设备开头开始写入数据if (write(fd, data_to_write, data_len) != data_len) {perror("Error writing to MTD block device");close(fd);return EXIT_FAILURE;}// 关闭MTD块设备close(fd);printf("Data successfully written to MTD block device.\n");return EXIT_SUCCESS;
}

  在这个示例中,我们首先打开/dev/mtdblock0设备进行读写操作。然后,我们使用BLKGETSIZE64ioctl调用来获取设备的总大小。接着,我们使用BLKERASEioctl调用来擦除整个设备。最后,我们使用write函数将一个简单的字符串写入设备。

  请注意,这个示例代码假设整个设备都需要擦除,这可能不是所有情况的最佳实践。在实际应用中,您可能需要根据设备的擦除块大小和您的写入需求来计算需要擦除的确切区域。

  在编译和运行此代码之前,请确保您有足够的权限(通常需要root权限),并且/dev/mtdblock*设备文件确实存在于您的系统中。您可以使用以下命令来编译代码:

gcc -o mtdblock_write mtdblock_write.c

  然后,使用以下命令以root用户身份运行编译后的程序:

sudo ./mtdblock_write

  请记住,在对MTD设备进行操作时,您应该非常小心,因为不正确的操作可能会导致数据丢失。在实际部署之前,务必在受控环境中进行彻底的测试。

  欢迎大家指导和交流!如果我有任何错误或遗漏,请立即指正,我愿意学习改进。期待与大家一起进步!

相关文章:

深入了解 Linux 中的 MTD 设备:/dev/mtd* 与 /dev/mtdblock*

目录 前言一、什么是MTD子系统&#xff1f;二、 /dev/mtd* 设备文件用途注意事项 三、/dev/mtdblock* 设备文件用途注意事项 三、这两种设备文件的关系四、关norflash的一些小知识 前言 在嵌入式Linux系统的世界里&#xff0c;非易失性存储技术扮演着至关重要的角色。MTD&#…...

2、Spring CLI安装

安装 Spring CLI 提供了多种格式,让您选择自己喜欢的安装方法。可下载的制品可从发布页面获取。 二进制发行版 WindowsLinuxMac手动安装(Windows,其他自己看) spring-cli-standalone-<version>-windows.x86_64.zip - 打包了 x86 JDKspring-cli-installer-<versi…...

数据库备份工具(实现数据定时覆盖)

数据库备份工具&#xff08;实现数据定时覆盖&#xff09; 永远热爱&#xff0c;永远执着&#xff01; 工具介绍 自动化测试数据库更新调度程序 这段 Python 脚本自动化了每天定时从生产数据库更新测试数据库的过程。它利用了 schedule 库来安排并执行每天指定时间的更新任务…...

测试环境搭建整套大数据系统(十二:挂载磁盘到hadoop环境)

一&#xff1a;链接硬盘 将硬盘连接到计算机的 SATA 接口或 USB 接口&#xff0c;并确保硬盘通电并处于可用状态。 二&#xff1a;查看硬盘信息 sudo fdisk -l三&#xff1a;创建分区 gdisk /dev/vbd重新扫描磁盘 partprobe /dev/vdb格式化磁盘 mkfs.ext4 /dev/vdb2查看磁…...

Spring事务核心:声明式事务注解式事务

全解&#xff1a;声明式事务和注解事务 在Spring中&#xff0c;事务管理是一个非常重要的特性&#xff0c;它可以帮助开发者在应用程序中实现事务控制。Spring提供了两种事务管理方式&#xff1a;声明式事务和注解事务。 1. 声明式事务 声明式事务是指通过配置文件或注解的方…...

AcWing 1015. 摘花生

Problem: AcWing 1015. 摘花生 文章目录 思路解题方法复杂度Code 思路 这是一个典型的动态规划问题。我们需要在一个二维网格中&#xff0c;从左上角走到右下角&#xff0c;每次只能向右或向下移动&#xff0c;目标是使得经过的路径上的数字之和最大。 我们可以定义dp[i][j]为从…...

Dalle-3、Sora、Stable Diffusion 3 掀起AIGC新浪潮

随着科技的飞速发展&#xff0c;我们迎来了视觉AIGC高光时刻&#xff0c;一个充满无限可能与机遇的新时代。在这个时代里&#xff0c;三大里程碑Dalle-3、Sora和Stable Diffusion 3以其炸裂式的技术发展&#xff0c;引领着AIGC领域的新浪潮。文章首先做相应简要介绍&#xff0c…...

Unity 视频组件 VideoPlayer

组件添加&#xff1a; 在自己定义的组件下&#xff08;例如&#xff1a;Panel&#xff09; 点击 Inspector 面板中的 AddComponent &#xff0c;输入“VideoPlayer”。 资源 这里 视频资源有两种形式&#xff0c;第一种是 VideoClip &#xff0c;需要将视频文件拖拽到该属性字段…...

RSTP环路避免实验(华为)

思科设备参考&#xff1a;RSTP环路避免实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 RSTP (Rapid Spanning Tree Protocol) 是从STP发展而来 • RSTP标准版本为IEEE802.1w • RSTP具备STP的所有功能&#xff0c;可以兼容STP运行 • RSTP和STP有所不同 减少了…...

Arduino IDE工程代码多文件编程和中文设置

一、esp8266模块信息 二、中英文切换 点击文件( File )–选择首选项( Preference )—选择语言( Language )—选择中文–点击确定( OK ) 三、多文件编程 在Arduino编程中&#xff0c;将代码分割成多个文件是一种很好的做法&#xff0c;特别是项目变得越来越大和复杂时。这样…...

【微服务】Eureka(服务注册,服务发现)

文章目录 1.基本介绍1.学前说明2.当前架构分析1.示意图2.问题分析 3.引出Eureka1.项目架构分析2.上图解读 2.创建单机版的Eureka1.创建 e-commerce-eureka-server-9001 子模块2.检查父子pom.xml1.子 pom.xml2.父 pom.xml 3.pom.xml 引入依赖4.application.yml 配置eureka服务5.…...

windows上ssh设置代理,直接访问公司内网

ssh设置代理一般来说很简单&#xff0c;对于无密码或者可以支持密钥登录的&#xff0c;都比较无脑 难的地方在于使用用户名密码认证来使用一个http的代理或者socks5的代理&#xff0c;密码如何设置&#xff1f;特殊字符如何处理&#xff1f; 直接上答案&#xff0c;.ssh/conf…...

C++ union用法

在C中&#xff0c;union是一种特殊的数据类型&#xff0c;可以在同一个内存位置存储不同的数据类型。它的用法如下&#xff1a; 1. 声明union类型&#xff1a;使用关键字union加上union名称来声明一个union类型。 c union UnionName { dataType1 member1; dataType2 …...

JavaSE_运算符 案例分析

/*符号在字符串中的操作: 表示连接,会将其他内容和字符串连接在一起,形成一个字符串目标:理解符号在字符串中的作用会将其他内容和字符串连接在一起,形成一个字符串*/ public class Operator03 {public static void main(String[] args) {System.out.println("5 5 "…...

15、Spring Cloud Alibaba Sentinel实现熔断与限流

注&#xff1a;本篇文章主要参考周阳老师讲解的cloud进行整理的&#xff01; 1、Sentinel 1.1、官网 https://sentinelguard.io/zh-cn/ 等价对标 Spring Cloud Circuit Breaker 1.2、是什么 https://github.com/alibaba/Sentinel/wiki 1.3、去哪下 https://github.com/alibab…...

Linux logout命令教程:如何安全地退出Linux会话(附实例详解和注意事项)

Linux logout命令介绍 logout命令用于退出当前的登录Shell。这个命令可以被普通用户用来结束他们自己的会话。 Linux logout命令适用的Linux版本 logout命令在所有主流的Linux发行版中都是可用的&#xff0c;包括但不限于Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、R…...

数据结构——顺序表(C语言版)

顺序表是数据结构中最基本的一种线性表&#xff0c;它以一段连续的存储空间来存储数据元素&#xff0c;元素之间的顺序由它们在内存中的位置来决定。在C语言中&#xff0c;我们通常使用数组来实现顺序表。 目录 顺序表的结构定义 顺序表的基本操作 应用实例 顺序表的结构定义…...

Knative 助力 XTransfer 加速应用云原生 Serverless 化

作者&#xff1a;元毅 公司介绍 XTransfer 是一站式外贸企业跨境金融和风控服务公司&#xff0c;致力于帮助中小微企业大幅降低全球展业的门槛和成本&#xff0c;提升全球竞争力。公司连续7年专注 B2B 外贸金融服务&#xff0c;已成为中国 B2B 外贸金融第一平台&#xff0c;目…...

服务器离线配置vscode连接,conda虚拟环境

记录一下服务器离线配置问题&#xff0c;以备不时之需。 服务器离线配置 vscode连接参考&#xff1a;vscode-server离线安装-CSDN博客 服务器离线配置conda虚拟环境&#xff1a;Conda 环境离线迁移&#xff08;服务器断网情况下搭建虚拟环境envs&#xff09; - 知乎 上次两个…...

各种需要使用的方法-->vue/微信小程序/layui

各种需要使用的方法-->vue/微信小程序/layui 1、vue里样式不起作用的方法&#xff0c;可以通过deep穿透的方式2、 js获取本周、上周、本月、上月日期3、ArrayBuffer Blob 格式转换ArrayBuffer与Blob的区别ArrayBuffer转BlobBlob转ArrayBuffer需要借助fileReader对象 4、使用…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...