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

相关推荐
面汤放盐4 分钟前
何时使用以及何时不应使用微服务:没有银弹
java·运维·云计算
子琦啊25 分钟前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法
跨境数据猎手1 小时前
跨境独立站系统技术拆解(附带源码)
服务器·前端·php
AOwhisky1 小时前
Kubernetes 学习笔记:集群管理、命名空间与 Pod 基础
linux·运维·笔记·学习·云原生·kubernetes
小龙在慢慢变强..2 小时前
目录结构(FHS 标准)
linux·运维·服务器
2035去旅行2 小时前
嵌入式开发,如何选择C标准库
linux·arm开发
刘延林.2 小时前
win11系统下通过 WSL2 安装Ubuntu 24.04 使用RTX 5080 GPU
linux·运维·ubuntu
星恒讯工业路由器2 小时前
星恒讯工业生产自动化解决方案
运维·物联网·自动化·智能路由器·信息与通信
a8a3022 小时前
Laravel9.x新特性全解析
运维·spring boot·nginx