mtd block device和block device区别,MTD设备的一般不宜挂载fat,ext2,ext3等文件系统原因

本文深入探讨NandFlash存储原理,包括其结构、ECC、坏块管理、负载均衡及驱动程序设计。同时,对比blockdevice与mtddevice,解析MTD在Linux系统中的角色,以及常见文件系统如JFFS2、YAFFS、UBIFS的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章系转载:https://dolaameng328.iteye.com/blog/1502547

本文添加自己理解:

1、可以解释为什么MTD设备的一般不宜挂载fat,ext2,ext3等文件系统——原因是MTD设备没有硬件的坏块管理和负载均衡等,需要软件层面做这些。

2、mtd block device和block device区别——详细看后文对比表


特点
Nand flash存储结构为chip->(plane)->block->page>byte。
page分为数据区和oob(out of band),oob用于存放ecc码、标记坏块和文件系统备用等。
Nand flash的物理特性决定了每一个bit只能从1变为0,不能从0变为1。
Nand flash在出厂和使用过程中可能出现某些bit错误,所以采用了ecc的纠错和检错方法。
在读写过程中Nand flash状态寄存器返回错误或者发现多个bit发生不能纠错的错误,则可以标记该block为坏块,将该block的第一第二page的oob的相应byte置为非0xff,文件系统/操作系统需要管理坏块。

Nand flash的命令包括擦除、读、写,擦除针对block进行,将整个block全部置为1;读和写都针对page进行。因为每个bit只能从1到0,所以每次写之前,要进行擦除。基本三个阶段:命令->地址->数据,不同阶段根据引脚(片选、读\写使能、命令\地址锁存引脚等)决定。

对每个block中的page访问必须是顺序的,不能是随机的。
擦除和写次数是有寿命的,通常可达10万次。所以不能频繁对某个block进行擦除和写,所以软件需要将擦除和写平摊到每个block上,这种操作叫做负载均衡wear leveling。

Nand flash的IO是复用的,这样的好处就是pin少,可扩展性好。





ecc
ecc有软件和硬件之分。
对于硬件ecc来说,在写page的时候,硬件自动产生ecc,将其存入oob的某些byte。在读page的时候,硬件也自动产生一个ecc,并和oob比较,通过比较可以实现纠错和检错。
详见:
http://dev.firnow.com/course/3_program/c/c_js/20100710/397316.html

Nand flash controller
Nand flash只是相当于cpu的一个外设,并不位于内存地址区。cpu内部有Nand flash controller与Nand flash打交道。

驱动程序
所谓Nand flash的驱动也就是对Nand flash controller编程(发送命令/写寄存器都是同样的意思)。驱动程序的结构大同小异,区别在于每家芯片的Nand flash controller的设计不同,所以对controller的编程的部分是不同的,还有不同的在于数据传输(比如,数据是拷贝或是DMA等)。

对于硬件ecc来说,基本的驱动包括下述功能:擦除block、读写page、ecc判断、坏块标识、读取Nand状态、等待Nand、复位Nand、初始化等;

初始化中要开辟驱动程序需要的memory,设置工作模式(page大小、block大小、时钟频率、ecc模式等),和对函数指针赋值:




驱动是分层的,以上是最底层的chip的驱动,是为了上层MTD服务的。
以读page为例:
chip->cmdfunc(MTD, NAND_CMD_READ0, 0x00, page);//先发读命令,由controller将读命令发给nand flash
chip->ecc.read_page(MTD, chip, buf);//然后读取数据(拷贝或者DMA方式),其中还有ecc校验


关于MTD的驱动架构详见:
如何编写Linux下Nand Flash驱动

MTD
linux下的设备分成block device和character device,flash两者都不是属于MTD(Memory Technology Device)。但这个只是指代的是原始的Nand flash和Nor flash芯片,衍生产品如SSD, MMC, eMMC, RS-MMC, SD, mini-SD, micro-SD, USB flash都属于block device。

block device和mtd device的区别如下:



像传统的文件系统,如FAT、ntfs、ext2、ext3等,都是建立在block device上的。MTD有自己的文件系统。

SSD, MMC, eMMC, RS-MMC, SD, mini-SD, micro-SD, USB flash这些设备里面的储存媒介当然还是flash,但是拆开它们还会发现一块MCU,它的firmware实现了FTL。所谓FTL是Flash Translation Layers,从软件上将flash“模拟”为block device了。

FTL的重要功能包括负载均衡、逻辑地址与物理地址映射、提供与block device相同的访问界面(512 bytes/sector)。FTL建立在MTD之上,传统的文件系统再建立在FTL之上。但每家厂家的FTL是不公开的,所以不知道好坏真的如何。遇到使用不好的FTL的U盘,可能马上出现“IO读写错误”了!

详见:
http://www.linux-mtd.infradead.org/index.html

文件系统
常见的有JFFS2、YAFFS、TrueFFS文件系统都提供了坏块管理、负载均衡,ecc纠错检错等功能。
有UBIFS,UBIFS建立在UBI层上,UBI层建立在MTD上,而上述的两个文件系统是直接建立在MTD上的。
UBI要的工作就是实现更好的负载均衡和坏块管理,减轻文件系统的工作。
 
 详见:
 http://www.linux-mtd.infradead.org/doc/ubifs.html
 
一般系统启动流程
Nor flash类似ram,地址线和数据线分开,一般位于内存地址区,支持代码片上执行。嵌入式芯片内部一般还有rom,从rom跳转到nor flash中执行代码,该代码称为bootloader,它初始化外设,串口、dram、nand flash等。之后bootloader把Nand flash中的main code拷贝到dram中去,接着跳转到main code入口。
当然启动有多种方式,main code较小的也有直接放在nor flash中,bootloader较大可能还会把自己也拷贝到dram中去。

<think>好的,用户现在问的是如何在Linux下查看Flash大小。之前他问过查看内存使用情况,我给出了几种方法,比如free、top、/proc/meminfo等。现在这个问题有点不同,但可能需要类似的思路。 首先,我需要明确用户所说的“Flash”具体指什么。因为“Flash”可能有不同的含义。一种可能是NOR或NAND闪存,通常指的是固态存储设备,比如SSD或者U盘。另一种可能是指BIOS或固件芯片的闪存。但大多数情况下,用户可能是指连接到系统的闪存存储设备的大小,比如SD卡、USB闪存驱动器或者SSD。 接下来,我需要回忆Linux下查看存储设备信息的常用命令。常用的有lsblk、fdisk、parted、df、hdparm等。此外,查看/proc/mtd可以获取MTD(Memory Technology Device)信息,这可能适用于嵌入式系统中的闪存分区。但对于普通用户来说,可能更常用的是检查块设备的大小。 然后,我需要考虑用户的使用场景。用户可能是在嵌入式系统中工作,需要知道闪存芯片的大小,或者是在普通PC环境下查看连接的闪存设备的大小。如果是嵌入式系统,可能需要查看MTD分区信息;如果是普通存储设备,可能需要用lsblk或fdisk查看磁盘信息。 另外,用户可能没有明确说明是查看已挂载文件系统大小,还是物理存储设备的总容量。比如,df命令可以查看已挂载文件系统的使用情况,而lsblk或fdisk可以查看物理设备的容量。需要区分这两者。 同时,要考虑到用户可能的权限问题,有些命令可能需要sudo权限才能执行,比如fdisk或hdparm。需要提醒用户注意这一点。 还要注意,不同的Linux发行版可能有不同的工具安装情况,比如lsblk在较新的系统中常见,而旧系统可能需要安装util-linux包。或者像smartctl这样的工具需要安装smartmontools。 最后,需要组织这些信息,分步骤介绍不同的方法,并给出示例命令输出解释,确保用户能够理解并选择适合自己情况的方法。可能还需要解释一些关键术语,比如MTD、块设备等,帮助用户更好地理解。在</think> Linux 系统中,"Flash" 通常指存储设备(如 SSD、U盘、SD卡等)或嵌入式设备的闪存芯片(如 NOR/NAND Flash)。查看其大小的方法取决于具体设备用途。以下是常见场景的指令及说明: --- ### **1. 查看块设备(如 SSD、U盘)的容量** 适用于普通存储设备(如 `/dev/sda`、`/dev/nvme0n1` 等)。 #### **方法 1:`lsblk`(推荐)** 列出所有块设备及其容量(包括未挂载设备): ```bash lsblk -o NAME,SIZE,TYPE,MOUNTPOINT ``` - **输出示例**: ``` NAME SIZE TYPE MOUNTPOINT sda 238.5G disk ├─sda1 512M part /boot/efi └─sda2 238G part / nvme0n1 500G disk ``` - `SIZE` 列显示设备总容量。 #### **方法 2:`fdisk -l`** 查看磁盘详细信息(需要 root 权限): ```bash sudo fdisk -l ``` - 输出中会显示每个磁盘的 `Disk size`,例如: ``` Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors ``` --- ### **2. 查看嵌入式设备的 Flash 芯片大小** 适用于嵌入式 Linux 系统(如 NOR/NAND Flash 芯片)。 #### **方法 1:查看 `/proc/mtd`** 显示内存技术设备MTD)的分区信息: ```bash cat /proc/mtd ``` - **输出示例**: ``` dev: size erasesize name mtd0: 00800000 00020000 "bootloader" mtd1: 10000000 00020000 "rootfs" ``` - `size` 列以十六进制显示分区大小(如 `00800000` = 8MB)。 #### **方法 2:使用 `mtdinfo`** 获取详细的 MTD 设备信息(需安装 `mtd-utils`): ```bash sudo apt install mtd-utils # CentOS/RHEL mtdinfo /dev/mtd0 ``` - 输出包含 `Size`、`Eraseblock size` 等关键信息。 --- ### **3. 查看文件系统的可用空间** 若 Flash 已格式化为文件系统(如 ext4、FAT32),可用 `df` 查看挂载点容量: ```bash df -h ``` - **输出示例**: ``` Filesystem Size Used Avail Use% Mounted on /dev/sda2 238G 50G 177G 22% / /dev/mmcblk0p1 14G 1.2G 13G 9% /media/sdcard ``` - `Size` 列显示设备总容量,`Avail` 为剩余可用空间。 --- ### **4. 查看 eMMC 或 SD 卡容量** 对于嵌入式 eMMC 或 SD 卡,可直接通过设备节点查询: ```bash cat /sys/block/mmcblk0/size ``` - 输出为扇区数量,计算实际大小: **容量(GB)= 扇区数 × 512(字节/扇区) / 1024&sup3;** 例如,`30535680 扇区` = 30535680 × 512 / 1073741824 ≈ 14.5GB。 --- ### **5. 使用 `hdparm` 获取硬盘信息** 查看 SSD 或机械硬盘的详细信息: ```bash sudo hdparm -I /dev/sda ``` - 输出包含 `device size`、`LBA 容量` 等字段。 --- ### **关键概念解释** - **块设备Block Device)**:如硬盘、SSD、U盘等以数据块为单位读写的设备。 - **MTD(Memory Technology Device)**:直接操作闪存芯片的接口,常见于嵌入式系统。 - **扇区(Sector)**:磁盘的最小存储单元(通常 512 字节或 4KB)。 --- ### **总结** - 普通存储设备(SSD/U盘):用 `lsblk`、`fdisk -l` 或 `df -h`。 - 嵌入式 Flash 芯片:查看 `/proc/mtd` 或使用 `mtdinfo`。 - 直接计算:通过 `/sys/block` 下的文件或 `hdparm` 获取原始数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值