EMMC得写入逻辑是怎样的?比如说我的emmc上有三个分区,第一个分区是30M,但是我的程序实际占用过了10M,第二个分区是80M,当前实际占用40M,剩余磁盘空间作为第3个分区,制作烧录包时会将每个分区填充满吗?
1. eMMC物理写入的基本逻辑
eMMC(embedded MultiMediaCard)的写入单位是以页(Page)和块(Block)为单位进行的:
- 页(通常4KB~16KB):最小编程单位
- 块(通常256页~1MB):最小擦除单位
- 写入前必须擦除:这是NAND闪存的特性,eMMC内部控制器会管理这些细节。
2. 分区域烧录包的关系
制作烧录包时,通常不会填充未使用的空间,但具体取决于打包工具和策略:
常见做法:
-
仅包含实际数据 :烧录包通常只包含分区中实际有效的文件和数据,加上必要的文件系统结构
-
分区表信息:包含MBR/GPT分区表
-
文件系统结构:如FAT的FAT表、目录项等
在我们的例子中
分区1:30M(实际10M) → 烧录包可能只有10-12M(含文件系统开销)
分区2:80M(实际40M) → 烧录包可能只有40-42M
分区3:剩余空间 → 通常为空,或者根本不包含在烧录包中
3. 烧录包的两种主要形式
A. 镜像(Image)方式
**# 如:创建一个完整的分区镜像
dd if=/dev/mmcblk0p1 of=partition1.img bs=1M count=30这会生成30M的完整镜像,空白处填充0或随机数据**
-
优点:烧录简单,直接写块设备
-
缺点:包含大量无用数据,包体积大
B. 文件系统打包方式
**# 如:仅打包文件
tar czf rootfs.tar.gz -C /rootfs .
或使用专用工具如mkfs+文件拷贝**
4,稀松文件
1)什么是稀疏文件?
稀疏文件(sparse file)是一种特殊的文件系统特性,允许文件在逻辑上有很大的尺寸,但实际上只占用存储实际写入数据的磁盘空间。空洞部分(未写入数据的区域)不分配物理存储。只管比喻:
想象一个1000页的书:
逻辑大小:1000页
物理大小:只有实际写了字的页数(比如10页)
其余990页都是"此处有X页空白"的标记
2)稀疏文件的原理
常规文件:
文件内容: [数据块1][数据块2][数据块3]... # 每个数据块都分配物理存储
inode指向: → 块1 → 块2 → 块3 ...
稀疏文件:
文件内容: [数据块1]----空洞----[数据块2]----- # 空洞不分配存储
inode指向: → 块1 → (空洞标记) → 块2 → (空洞标记)
技术细节
- 块分配延迟:文件系统在床你看文件时不理解分配所有数据块
- 元数据记录:使用特殊标记(如ext4中的HOLE扩展属性),记录空洞范围
- 按需分配:只有当数据实际写入时,才分配物理存储块
3)如何创建稀疏文件
方法1:使用dd的seek参数(最常用)
创建4GB的稀疏文件(逻辑4GB,物理几乎0字节)
dd if=/dev/zero of=sparse.img bs=1M count=0 seek=4096
分解解释:
bs=1M : 块大小1MB
count=0 : 复制0个块(不复制任何数据)
seek=4096 : 在输出文件中跳过4096个块后开始写入
由于count=0,不写入数据,所以创建了4096MB的空洞文件
方法2:使用 truncate 命令
创建指定大小的稀疏文件
truncate -s 4G sparse.img
方法3:使用 fallocate(注意区别)
分配实际空间(非稀疏!)
fallocate -l 4G prealloc.img # 实际分配4GB磁盘空间
创建稀疏文件
fallocate -l 4G -n sparse.img # -n 表示创建空洞
5,挂载目录和镜像
在制作烧录镜像时,发现有如下命令:mount linaro-rootfs.img ./rootfs,挂在了一个文件,而不是目录,这种使用方法正确吗?答案是正确的。下面介绍mount 命令的两种主要用法。
挂载块设备到目录(传统方式)
挂载物理设备分区
mount /dev/sda1 /mnt
挂载回环设备(loop device)
mount /dev/loop0 ./rootfs
直接挂载文件系统镜像
# 直接挂载镜像文件 - Linux会自动创建回环设备
mount linaro-rootfs.img ./rootfs# 显式使用回环选项(更明确)
mount -o loop linaro-rootfs.img ./rootfs
为什么可以挂载文件?
关键在于镜像文件的特性:
- linaro-rootfs.img是一个完整的文件系统镜像
- 它包含了完整的文件系统结构(如ext4、squashfs等)
- Linux内核可以通过回环设备(loop device)将其虚拟成块设备
实际执行过程:
当执行 mount linaro-rootfs.img ./rootfs 时:
Linux自动分配一个回环设备(如 /dev/loop0)
将 linaro-rootfs.img 关联到这个回环设备
挂载这个回环设备到 ./rootfs 目录
如果写入的稀疏文件大于剩余空间
则APP报错:

烧录异常flash




所以说APP固件已经超出大小了。
能正常烧录的flash的可用空间为:
