ARM嵌入式驱动 2026-04-24 17:30 采纳率: 0%
浏览 5

获取EMMC健康报告方法

Linux下有什么办法可以读取到三星emmc5.0的擦除次数、坏块统计、总写入量等信息?

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2026-04-24 17:31
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    在Linux系统下,要获取 三星 EMMC 5.0 的健康信息(如擦除次数、坏块统计、总写入量等),通常需要使用 smartctl 工具结合 libsmartmd 或者通过 ioctl 接口直接与 EMMC 设备通信。下面将详细说明如何实现这些功能,并提供相应的解决方案。


    ✅ 获取EMMC健康信息的常用方法

    1. 使用 smartctl 工具

    smartctl 是一个用于访问 SMART(Self-Monitoring, Analysis, and Reporting Technology)信息的工具,它支持多种存储设备,包括 SSD 和 EMMC。

    ✅ 步骤:

    1. 安装 smartmontools

      sudo apt-get install smartmontools
      
    2. 查看 EMMC 设备信息

      sudo smartctl -a /dev/mmcblk0
      

      这里 /dev/mmcblk0 是你的 EMMC 设备路径,具体路径可以通过 ls /dev/mmcblk* 查看。

    3. 检查是否支持 SMART 如果输出中包含以下内容,则表示 EMMC 支持 SMART:

      Device supports SMART and is in the SMART enabled state
      
    4. 查看健康报告 输出中会包含如下信息(以三星 EMMC 为例):

      • Total Write Count(总写入量)
      • Erase Count(擦除次数)
      • Bad Block Count(坏块数量)

    ⚠️ 注意:某些 EMMC 设备可能不完全支持 SMART 报告,尤其是较旧的型号或非标准厂商的设备。


    2. 通过 ioctl 直接读取 EMMC 块设备信息

    如果你无法通过 smartctl 获取到所需信息,可以尝试使用 C 语言编写程序,通过 ioctl 调用 Linux 内核提供的 EMMC 接口来读取信息。

    ✅ 示例代码(C语言):

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/ioctl.h>
    #include <linux/mmc/ioctl.h>
    
    int main(int argc, char *argv[]) {
        if (argc != 2) {
            fprintf(stderr, "Usage: %s <device>\n", argv[0]);
            return 1;
        }
    
        const char *dev = argv[1];
        int fd = open(dev, O_RDONLY);
        if (fd < 0) {
            perror("open");
            return 1;
        }
    
        struct mmc_ioctl_get_ext_csd ext_csd;
    
        if (ioctl(fd, MMC_IOC_GET_EXT_CSD, &ext_csd) < 0) {
            perror("ioctl");
            close(fd);
            return 1;
        }
    
        printf("Manufacturer ID: 0x%02X\n", ext_csd.mano);
        printf("Product Name: %s\n", ext_csd.pn);
        printf("Product Revision: %s\n", ext_csd.pr);
        printf("Total Write Count: %llu\n", (unsigned long long)ext_csd.total_pwr_on);
        printf("Erase Count: %u\n", ext_csd.erase_count);
        printf("Bad Block Count: %u\n", ext_csd.bad_block_count);
    
        close(fd);
        return 0;
    }
    

    ✅ 编译并运行:

    gcc -o emmc_info emmc_info.c
    sudo ./emmc_info /dev/mmcblk0
    

    ⚠️ 该方法依赖于内核对 MMC_IOC_GET_EXT_CSD 的支持,且部分字段(如 erase_count, total_pwr_on)可能不是所有 EMMC 都支持。


    3. 使用 dd + hexdump 手动解析 EMMC EXT CSD 数据

    对于更底层的调试需求,也可以使用 ddhexdump 来提取 EMMC 的 EXT CSD 区域,然后手动解析其中的字段。

    ✅ 示例命令:

    sudo dd if=/dev/mmcblk0 of=ext_csd.bin bs=512 count=1 skip=1
    sudo hexdump -C ext_csd.bin
    
    • EXT CSD 存储在 EMMC 的第 1 扇区(偏移 512 字节)。
    • 你可以参考 MMC EXT CSD 规范 来解析特定字段。

    🔧 解决方案总结

    以下是获取 EMMC 健康信息的推荐方法:

    1. 使用 smartctl 工具(最简单)

      • 安装 smartmontools
      • 执行 smartctl -a /dev/mmcblk0
      • 检查输出中的 Total Write Count, Erase Count, Bad Block Count
    2. 使用 C 程序通过 ioctl 获取信息(更灵活)

      • 编写 C 程序调用 MMC_IOC_GET_EXT_CSD
      • 可以自定义解析 EMMC 的 EXT CSD 字段
    3. 手动解析 EXT CSD 数据(适用于调试)

      • 使用 dd 提取 EXT CSD 区域
      • 使用 hexdump 分析数据

    📌 重点提示(加粗显示)

    • EMMC 不一定完全支持 SMART 技术,因此 smartctl 并不能保证一定能获取到所有信息
    • 对于 三星 EMMC 5.0,建议优先使用 smartctl,如果失败再尝试 ioctl 方法
    • 若需 高精度控制和解析,可考虑编写 C 程序,并参考 MMC 协议文档

    如有其他问题(如 EMMC 设备未被识别、驱动问题等),欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 4月24日