关于eMMC存储器在各种情况下的分区编号和名字的问题

前言

关于eMMC的分区编号和名字问题,表面上看是个小问题,事实上在程序开发中,没有小问题,一个变量值设置不对,可能整个程序或系统就跑不起来。eMMC的分区编号和名字问题就是一个事关嵌入式系统烧写和正常启动的关键问题,如果没有搞清楚,你根本用不好烧写工具,也无法将整个嵌入式系统启动起来。

关于这个问题,其实是要分情况的,具体分下面几种情况:

①在eMMC标准中的分区名字和编号问题;
②在u-boot的MMC系统中的分区编号问题;
③#在u-boot的Fastboot模式下各分区的名字和编号问题;
③在Linux中的分区名字和编号问题。

本篇博文具体介绍这此情况。

01-在eMMC标准中的分区名字和编号问题

在eMMC标准中的分区名字和编号问题,需要参考制定eMMC标准的组织提供的文档。

关于标准制定组织的介绍和文档的下载地址,请参考我的另一篇博文:
https://blog.csdn.net/wenhao_ir/article/details/145967306 【搜索“由JEDEC协会制定的”】

eMMC标准中的分区名字

在文档的224页对 EXT_CSD[179]各字段的解释如下:
在这里插入图片描述
在这里插入图片描述
上面划红线的内容实际上就是eMMC标准中对各分区的命名,根据这些名字,我们可以得出下面这个分区示意图:

+----------------------+ 0x00000000
| Boot Partition 1    |  (大小固定,如4MB)
+----------------------+
| Boot Partition 2    |  (大小固定,如4MB)
+----------------------+
| RPMB Partition      |  (大小固定,如512KB)
+----------------------+
| General Purpose 1   |  (可选)
+----------------------+
| General Purpose 2   |  (可选)
+----------------------+
| General Purpose 3   |  (可选)
+----------------------+
| General Purpose 4   |  (可选)
+----------------------+
| User Area      |  (最大存储区域)
+----------------------+ 0xFFFFFFFF

eMMC标准中的分区编号

至于各分区在eMMC标准中的分区编号问题,这要分情况,我们还是看下面两张图:
在这里插入图片描述
在这里插入图片描述
从上面的文档截图来看:
对于EXT_CSD[179]的BOOT_PARTITION_ENABLE字段,Boot partition 1被编号为1,Boot partition 2被编号为2,User area被编号为7。
对于EXT_CSD[179]的PARTITION_ACCESS字段,Boot partition 1仍被编号为1,Boot partition 2仍被编号为2,但User area被编号为0(即默认情况)。
关于BOOT_PARTITION_ENABLE字段和PARTITION_ACCESS字段的详情说明,请参看博文 https://blog.csdn.net/wenhao_ir/article/details/145967306 【搜索“字段说明”】

所以在不同情况下,eMMC标准中的编号是不一样的,但是还是有规律的,我们可以看到Boot partition 1基本都被编号为1,Boot partition 2也基本都被编号为2。

02-在u-boot的MMC系统中的分区编号问题

首先你要知道在u-boot中没有分区名字的说法,全是编号。

在u-boot中的分区编号的意义其实也要根据具体的命令来定,在博文 https://blog.csdn.net/wenhao_ir/article/details/146016551 中我列举出了u-boot用于管理MMC设备的子系统的常见命令。

在这些命令中,不同命令中的不同编号意义不一样,常用的如下:

命令mmc dev [dev] [part] 中的part参数的意义

命令mmc dev [dev] [part] 中的part参数的意义实际上我在博文https://blog.csdn.net/wenhao_ir/article/details/146016551 中已经说得很清楚了,详情请在博文 https://blog.csdn.net/wenhao_ir/article/details/146016551 中搜索关键词“指定要使用的分区编号”。

总结一下就是在命令mmc dev [dev] [part] 中的part参数的意义来自于EXT_CSD[179]的字段PARTITION_ACCESS。而关于EXT_CSD[179]的字段PARTITION_ACCESS的详细介绍见博文 https://blog.csdn.net/wenhao_ir/article/details/145967306 【搜索“即哪个分区作为前活动分区”】

命令mmc part 输出信息中part列编号的意义

命令mmc part 用于列出 MMC 设备上的当前活动分区的逻辑分区信息。

详细的分析我在博文https://blog.csdn.net/wenhao_ir/article/details/146016551 中已经说得很清楚了,详情请在博文 https://blog.csdn.net/wenhao_ir/article/details/146016551 中搜索关键词“列出 MMC 设备上的当前活动分区的逻辑分区信息”。

总结一下就是在命令mmc part 输出信息中part列编号的意义是当前活动分区(通常为User Area区)的逻辑分区的编号。

加载内核的命令fatloadext4load中part参数的意义

命令fatloadext4load中part参数的意义的详细分析我在博文https://blog.csdn.net/wenhao_ir/article/details/146016551 中已经说得很清楚了,详情请在博文 https://blog.csdn.net/wenhao_ir/article/details/146016551 中搜索关键词“fatload mmc”。

总结一下就是在命令fatload mmcext4load mmc 命令中part参数的意义为当前活动分区(通常为User Area区)的逻辑分区的编号。也就是与命令mmc part 输出信息中part列编号的意义一样。所以对于命令fatloadext4load中需要的part参数实际上我们可以从命令mmc part 的输出信息获取。

03-在u-boot的Fastboot模式下各分区的名字和编号问题

Fastboot模式下我们重点说下flash烧写命令是把文件烧写到eMMC存储设备的哪个位置?
比如下面这条命令:

flash bootloader ../../../files/u-boot-dtb.imx

它到底是把u-boot-dtb.imx烧写到eMMC设备的哪个分区?它写到哪个分区是在哪里设置的?
这个问题其实我在博文 https://blog.csdn.net/wenhao_ir/article/details/145985144 中详细解释了,请在博文 https://blog.csdn.net/wenhao_ir/article/details/145985144 中搜索关键词“Fastboot的flash命令如何确定将镜像烧写到哪里”。

总结一下:对于Fastboot模式下的下flash烧写命令,各区的名字是由u-boot中与Fastboot有关的代码定义的,各分区也没有编号,而是一种名字与具体烧写地址的映射关系。

04-在Linux中的分区名字和编号问题

在Linux系统中,eMMC的不同区域通常会映射成不同的设备节点,所以在Linux中,各分区的名字就是各设备节点的设备文件名。

假设eMMC存储设备在Linux系统中的编号为1,则示例如下:

eMMC区域设备节点示例说明
Boot Partition 1/dev/mmcblk1boot0引导分区 1
Boot Partition 2/dev/mmcblk1boot1引导分区 2
RPMB Partition/dev/mmcblk1rpmb认证存储区(受保护)
User Area/dev/mmcblk1整个用户数据区
User Area的第1个逻辑分区/dev/mmcblk1p1用户数据区的第1个逻辑分区
User Area的第2个逻辑分区/dev/mmcblk1p2用户数据区的第2个逻辑分区

那么我们自然要问,如何查看Linux系统的eMMC的分区信息(设备节点信息)呢?
可以使用以下命令查看eMMC的分区信息:

lsblk
cat /proc/partitions
ls /dev/mmcblk*
fdisk -l /dev/mmcblk*

我的开发板运行命令lsblk的结果如下:
在这里插入图片描述
我的开发板运行命令cat /proc/partitions的结果如下:
在这里插入图片描述

[root@imx6ull:~]# cat /proc/partitions
major minor  #blocks  name
.....179        0    3817472 mmcblk1179        1     512000 mmcblk1p1179        2    1048576 mmcblk1p2179        3      10240 mmcblk1p3179       24       4096 mmcblk1rpmb179       16       4096 mmcblk1boot1179        8       4096 mmcblk1boot0

从运行结果来看,用户数据区(User Area )的设备节点名为mmcblk1,它被划分成了三个逻辑分区,分别为mmcblk1p1mmcblk1p2mmcblk1p3,容量大小情况如下:
mmcblk1:3817472KB = 3728MB ≈ 3.6GB
mmcblk1p1:512000KB = 500MB ≈ 0.48GB
mmcblk1p2:1048576KB = 1024MB ≈ 1 GB
mmcblk1p3:10240KB = 10MB
可见,用户数据区(User Area )的第2逻辑分区是最大的,有1个GB的大小。这也是百问网要把根文件系统、设备树文件、内核镜像放在第2逻辑分区中的原因,因为它最大啊。

命令fdisk -l /dev/mmcblk*的运行结果如下:
在这里插入图片描述
从中可以看到eMMC设备节点的详细信息,我整理一下输出信息如下:

[root@imx6ull:~]# fdisk -l /dev/mmcblk*Disk /dev/mmcblk1boot0: 4 MB, 4194304 bytes, 8192 sectors
128 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes
Disk /dev/mmcblk1boot0 doesn't contain a valid partition tableDisk /dev/mmcblk1boot1: 4 MB, 4194304 bytes, 8192 sectors
128 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes
Disk /dev/mmcblk1boot1 doesn't contain a valid partition tableDisk /dev/mmcblk1: 3728 MB, 3909091328 bytes, 7634944 sectors
119296 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes
Device       Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type
/dev/mmcblk1p1 *  0,65,4      63,254,1          4098    1028097    1024000  500M 83 Linux
/dev/mmcblk1p2 *  63,254,2    194,137,9      1028098    3125249    2097152 1024M 83 Linux
/dev/mmcblk1p3    194,137,10  195,207,14     3125250    3145729      20480 10.0M  c Win95 FAT32 (LBA)Disk /dev/mmcblk1p1: 500 MB, 524288000 bytes, 1024000 sectors
16000 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes
Disk /dev/mmcblk1p1 doesn't contain a valid partition tableDisk /dev/mmcblk1p2: 1024 MB, 1073741824 bytes, 2097152 sectors
32768 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes
Disk /dev/mmcblk1p2 doesn't contain a valid partition tableDisk /dev/mmcblk1p3: 10 MB, 10485760 bytes, 20480 sectors
320 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes
Disk /dev/mmcblk1p3 doesn't contain a valid partition tablefdisk: can't open '/dev/mmcblk1rpmb': Input/output error

上面输出信息中mmcblk1p1mmcblk1p2在Boot项上有个*代表这两个分区是可引导的,但在ARM 嵌入式系统这个信息不重要,原因是i.MX6ULL 内部的 ROM中的 代码可以直接从 eMMC 的Boot Partition (比如mmcblk1boot1) 中加载 U-Boot,无需从用户数据区去加载引导程序(u-boot)。这里的* 号只是一个标志,表示该分区被设定为可引导,但不一定真正参与系统启动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29463.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nuxt2-vue2:通过编程方式调用对话框 el-dialog

一、背景 1.1、需求 项目:nuxt2 vue2 希望通过编程方式的调用打开对话框,展现我们想要的内容。 1.2、效果 二、代码 2.1、插件 plugins/dialog.js import Vue from vue; import { Dialog } from element-ui; // 本文使用了Dialog组件,…

记录一些面试遇到的问题

重载和重写的区别 重载是overload,覆盖是override 重载属于编译时多态,覆盖属于运行时多态 运行时多态和编译时多态 运行时多态指的是在运行的时候才知道要调用哪一个函数,编译时多态是指在编译的时候就知道调用哪一个函数。 运行时多态…

【为什么会有 map、weakmap 类型?】

为什么会有 map、weakmap 类型? 传统对象的局限性催生 Map‌1. 键类型单一性‌2. 有序性与迭代支持‌3. 性能优化场景‌ 内存管理需求催生 WeakMap‌1.弱引用机制‌2. 私有数据存储‌3. 规避循环引用问题‌ 总结 传统对象的局限性催生 Map‌ 1. 键类型单一性‌ 传统对象&…

Django下防御Race Condition

目录 漏洞原因 环境搭建 复现 A.无锁无事务时的竞争攻击 B.无锁有事务时的竞争攻击 防御 A.悲观锁加事务防御 B.乐观锁加事务防御 总结 漏洞原因 Race Condition 发生在多个执行实体(如线程、进程)同时访问共享资源时,由于执行顺序…

课题推荐——无人机在UWB环境下基于TOA/TDOA/AOA的室内定位与精度对比

随着无人机在工业检测、仓储物流、应急救援等室内场景的广泛应用,高精度室内定位技术成为关键支撑。超宽带(UWB)技术凭借其高时间分辨率、强抗多径能力等优势,成为室内定位的主流方案。然而,不同的定位方法&#xff08…

c语言笔记 fgets

fgets 是 C语言中的一个标准输入输出函数,用于从输入流(如文件、键盘等)读取一行字符串。它的名字来源于 "File GeT Sring",表示从文件中读取字符串。 fgets 的函数原型如下: char *fgets(char *str, int n,…

【含文档+PPT+源码】基于微信小程序的农产品自主供销商城系统

项目介绍 本课程演示的是一款基于微信小程序的农产品自主供销商城系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3…

ReAct论文阅读笔记总结

ReAct:Synergizing Reasoning and Acting in Language Models 背景 最近的研究结果暗示了在自主系统中结合语言推理与交互决策的可能性。 一方面,经过适当Prompt的大型语言模型(LLMs)已经展示了在算术、常识和符号推理任务中通…

20250306-笔记-精读class CVRPEnv:step(self, selected)

文章目录 前言一、if self.time_step<4:控制时间步的递增判断是否在配送中心特定时间步的操作更新更新当前节点和已选择节点列表更新需求和负载更新访问标记更新负无穷掩码更新步骤状态&#xff0c;将更新后的状态同步到 self.step_state 二、使用步骤总结 前言 class CVRP…

nginx服务器实现上传文件功能_使用nginx-upload-module模块

目录 conf文件内容如下html文件内容如下上传文件功能展示 conf文件内容如下 #user nobody; worker_processes 1;error_log /usr/logs/error.log; #error_log /usr/logs/error.log notice; #error_log /usr/logs/error.log info;#pid /usr/logs/nginx.pid;even…

mapbox进阶,模仿百度,简单实现室内楼层切换

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️fill-extrusion三维填充图层样式1.4 ☘…

String / StringBuffer / StringBuilder 的区别是什么?

String、StringBuffer 和 StringBuilder 都是 Java 中用于处理字符串的类&#xff0c;但它们在多个方面存在区别&#xff0c;以下是详细介绍&#xff1a; 1. 可变性 4. 使用场景 String&#xff1a;String 类是不可变的&#xff0c;一旦创建了一个 String 对象&#xff0c;它的…

为何吹订单?因为特斯拉的销量已遥遥领先,掩耳盗铃之举!

从去年以来&#xff0c;多家新造车企业都经常拿大定、小定的数据来说事&#xff0c;而不是如之前说销量领先&#xff0c;原因就在于他们曾对标的特斯拉在销量方面已远远超越&#xff0c;在销量方面无法与特斯拉比拼&#xff0c;就只好用订单 国内媒体一片宣传特斯拉在中国的销量…

深入掌握Redis:从原理到实践的全方位指南

文章为原创&#xff0c;转载请注明出处——Gavana - 半分之月&#x1f319;。 文章在我的博客中同步更新&#xff0c;也可访问本文链接——深入掌握Redis&#xff1a;从原理到实践的全方位指南 | Gavana 关注AI开发工程师Gavana&#xff0c;带你了解更多实用有趣的AI宝藏✨ 个人…

结构型模式---享元模式

概念 享元模式是一种结构型设计模式&#xff0c;他摒弃了在每个对象中保存所有数据的方式&#xff0c;通过共享多个对象所共有的相同状态&#xff0c;让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态&#xff1a;就…

【Altium】22.11版本后如何导出Gerber镜像层

1、 文档目标 解决 22.11 版本后如何导出 Gerber 镜像层的问题 2、 问题场景 Gerber 导出旧版本&#xff0c;在 AD 22.11 之前的 Gerber 导出中是存在镜像层的选择。 图 1 软件更新至 AD22.11 及之后版本&#xff0c;在 Gerber 导出设置中无法选择层镜像进行导出。 图 2 3、…

Ubuntu 合上屏幕 不待机 设置

有时候需要Ubuntu的机器合上屏幕的时候也能正常工作&#xff0c;而不是处于待机状态。 需要进行配置文件的设置&#xff0c;并重启即可。 1. 修改配置文件 /etc/systemd/logind.conf sudo vi /etc/systemd/logind.conf 然后输入i&#xff0c;进入插入状态&#xff0c;修改如…

Dockerfile 深入浅出:从基础到进阶全解析

Dockerfile 深入浅出&#xff1a;从基础到进阶全解析 各位同学&#xff0c;大家好&#xff01;欢迎来到今天的 Dockerfile 课程。Docker 技术在当今的软件开发和部署领域可以说是非常热门&#xff0c;而 Dockerfile 作为构建 Docker 镜像的关键文件&#xff0c;掌握它对于我们…

视频录像机视频通道是指什么

视频录像机的视频通道是指摄像机在监控矩阵或硬盘录像机设备上的视频输入的物理位置。 与摄像头数量关系&#xff1a;在视频监控系统中&#xff0c;有多少个摄像头就需要多少路视频通道&#xff0c;通道数量决定了视频录像机可接入摄像头的数量&#xff0c;一般硬盘录像机有4路…

2025-03-06 学习记录--C/C++-PTA 习题6-6 使用函数输出一个整数的逆序数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h>int reverse( int number );int main…