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

相关推荐
ZFB000112 小时前
【麒麟桌面系统】V10-SP1 2503 系统知识——插入U盘(移动硬盘)为只读状态
linux·运维·kylin
龙仔72512 小时前
在麒麟V10服务器安全加固,sshd防暴力破解加固,实现“密码错误3次封IP”的需求
服务器·tcp/ip·安全
unfeeling_12 小时前
Keepalived实验
linux·服务器·网络
山峰哥12 小时前
吃透 SQL 优化:告别慢查询,解锁数据库高性能
服务器·数据库·sql·oracle·性能优化·编辑器
Web极客码13 小时前
解决WordPress后台“外观”菜单消失
linux·服务器·wordpress
熬夜有啥好13 小时前
Linux软件编程——综合小练习
linux·算法·目录遍历·fgets·strcpy·linux内核与用户交互·strtok
qizhideyu13 小时前
LVS(Linux virual server)
linux·运维·lvs
xiaoliuliu1234513 小时前
CentOS 7 安装 gcc-4.8.5-44.el7.x86_64.rpm 详细步骤(含依赖解决)
linux·运维·centos
白太岁13 小时前
通信:(5) 电路交换、报文交换与分组交换
运维·服务器·网络·网络协议
青桔柠薯片13 小时前
Linux软件编程:线程和进程间通信
linux·开发语言·线程·进程