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的可用空间为:

相关推荐
楼兰公子9 小时前
RK3588 + Linux7.0.3 网络工程调试错误速查手册
linux·网络·3588
Elnaij9 小时前
Linux系统与系统编程(9)——自设计shell与基础IO
linux·服务器
IpdataCloud10 小时前
稳定的企业级IP数据接口怎么选?可用性指标+离线库高可用方案
运维·网络·tcp/ip
WebGIS开发10 小时前
地信职业百科②:GIS运维
运维·gis·就业·转行
淘矿人10 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
JiaWen技术圈10 小时前
nginx 安全响应头 介绍
运维·nginx·安全
IMPYLH10 小时前
Linux 的 unexpand 命令
linux·运维·服务器·bash
想唱rap10 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
|_⊙11 小时前
Linux 文件知识 补充
linux·运维·服务器
落羽的落羽11 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划