EMMC写入/烧录逻辑

EMMC得写入逻辑是怎样的?比如说我的emmc上有三个分区,第一个分区是30M,但是我的程序实际占用过了10M,第二个分区是80M,当前实际占用40M,剩余磁盘空间作为第3个分区,制作烧录包时会将每个分区填充满吗?

1. eMMC物理写入的基本逻辑

eMMC(embedded MultiMediaCard)的写入单位是以页(Page)和块(Block)为单位进行的:

  • 页(通常4KB~16KB):最小编程单位
  • 块(通常256页~1MB):最小擦除单位
  • 写入前必须擦除:这是NAND闪存的特性,eMMC内部控制器会管理这些细节。

2. 分区域烧录包的关系

制作烧录包时,通常不会填充未使用的空间,但具体取决于打包工具和策略:

常见做法:

  1. 仅包含实际数据 :烧录包通常只包含分区中实际有效的文件和数据,加上必要的文件系统结构

  2. 分区表信息:包含MBR/GPT分区表

  3. 文件系统结构:如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 时:

  1. Linux自动分配一个回环设备(如 /dev/loop0)

  2. 将 linaro-rootfs.img 关联到这个回环设备

  3. 挂载这个回环设备到 ./rootfs 目录

如果写入的稀疏文件大于剩余空间

则APP报错:

烧录异常flash

所以说APP固件已经超出大小了。

能正常烧录的flash的可用空间为:

相关推荐
yixvxi2 小时前
RFC 8659:DNS CAA资源记录
服务器·https·ssl
予枫的编程笔记2 小时前
【Linux入门篇】Linux入门不踩坑:内核、发行版解析+环境搭建全流程
linux·ubuntu·centos·vmware·xshell·linux入门·linux环境搭建
去码头整点薯条982 小时前
python第五次作业
linux·前端·python
Trouvaille ~2 小时前
【Linux】UDP Socket编程实战(二):网络字典与回调设计
linux·运维·服务器·网络·c++·udp·操作系统
徐子元竟然被占了!!2 小时前
虚拟化技术
运维
为什么不问问神奇的海螺呢丶2 小时前
n9e categraf docker 监控配置
运维·docker·容器
Kiyra2 小时前
从《守望先锋》2026前瞻,看大型分布式系统的“重构”与“并发挑战”
运维·服务器·重构
青树寒鸦2 小时前
wsl的docker备份mongo和迁移
运维·mongodb·docker·容器
niceffking2 小时前
linux系统编程-线程概述
linux·运维