Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作

news2024/11/16 11:25:41

文章目录

  • 1、AB分区镜像制作
  • 2、uboot修改
  • 3、镜像启动

在上一篇 Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动中,我们通过buildroot制作了根文件系统,并通过 SD卡的形式将其挂载到设备并成功进行了启动,但上一章中,我们的做法非常简单粗暴,并且没有进行分区,在本章中我们将对对 SD镜像进行分区,并制作 AB分区的镜像。

1、AB分区镜像制作

uboot环境变量镜像制作:
1、在工程目录新建etc文件,并在里面新建uboot_env.txt文件,该文件用来描述所使用的环境变量,后续我们将会将其制作为uboot_env的环境变量镜像,并将其写入emmc(SD)分区中,uboot将从这里面去读取环境变量。

mkdir etc && cd etc &&  touch uboot_env.txt

在这里插入图片描述
并在uboot_env.txt中输入如下内容:

bootcmd=mmc read 0x60003000 0x3800 0x10000;mmc read 0x60500000 0x1800 0x400;bootm 0x60003000 - 0x60500000
bootargs=root=/dev/mmcblk0p9 init=/usr/sbin/init console=ttyAMA0

上面参数以及地址什么意思?别急,我们先将整个镜像制作出来在来说明上述参数含义,因为上面的参数都是根据我们制作的镜像进行计算的.

2、在script目录使用touch make_AB_img.sh && chmod 777 make_AB_img.sh命令创建AB分区镜像制作脚本,并在制作脚本输入如下内容:

#!/bin/bash
ROOT_PATH=$(pwd)
OUT_PATH=$ROOT_PATH/out/ab_img
if [ -e $OUT_PATH ]
then
    rm -rf $OUT_PATH
fi
mkdir $OUT_PATH -p
cd $OUT_PATH
# 磁盘总大小为8G
dd if=/dev/zero of=vexpress_ab.img bs=1M count=8192
# msic part 512K
sgdisk -n 0:0:+512k -c 0:misc vexpress_ab.img
# ubootenv part 512K 环境变量存放位置
sgdisk -n 0:0:+512k -c 0:ubootenv vexpress_ab.img
# dtb_a 512k 设备树
sgdisk -n 0:0:+512k -c 0:dtb_a vexpress_ab.img
# dtb_b 512k 设备树
sgdisk -n 0:0:+512k -c 0:dtb_b vexpress_ab.img
# vbmeta_a part 512K 安全校验
sgdisk -n 0:0:+512k -c 0:vbmeta_a vexpress_ab.img
# vbmeta_b part 512K
sgdisk -n 0:0:+512k -c 0:vbmeta_b vexpress_ab.img
# boot_a partition 32M kernel分区
sgdisk -n 0:0:+32M -c 0:boot_a vexpress_ab.img
# boot_b partition 32M kernel分区
sgdisk -n 0:0:+32M -c 0:boot_b vexpress_ab.img
# rootfs_a partition 512M
sgdisk -n 0:0:+512M -c 0:rootfs_a vexpress_ab.img
# rootfs_b partition 512M
sgdisk -n 0:0:+512M -c 0:rootfs_b vexpress_ab.img
# userdata partition 剩余所有大小分配给userdata分区
sgdisk -n 0:0:0 -c 0:userdata vexpress_ab.img

sync
# 显示分区信息
sgdisk -p vexpress_ab.img

# 读取分区信息并挂载到回环设备
LOOPDEV=`losetup -f`
echo $LOOPDEV
sudo losetup $LOOPDEV vexpress_ab.img
sudo partprobe $LOOPDEV
sudo losetup -l
ls -l $LOOPDEV*

# 将userdata格式化为ext4格式
# sudo mkfs.ext4 ${LOOPDEV}p9
# sudo mkfs.ext4 ${LOOPDEV}p10
sudo mkfs.ext4 ${LOOPDEV}p11

# 拷贝rootfs、kernel
mkdir tem_file
cp $ROOT_PATH/out/kernel-arm/arch/arm/boot/uImage tem_file/kernel
cp $ROOT_PATH/out/kernel-arm/arch/arm/boot/dts/vexpress-v2p-ca9.dtb tem_file/vexpress-v2p-ca9.dtb
cp $ROOT_PATH/out/rootfs-arm/images/rootfs.ext4 tem_file/rootfs.ext4
# 制作环境变量
mkenvimage -s 524288 -o tem_file/env.img $ROOT_PATH/etc/uboot_env.txt

# 将对应分区数据写入对应分区
sudo dd if=tem_file/env.img of=${LOOPDEV}p2 conv=notrunc
sudo dd if=tem_file/kernel of=${LOOPDEV}p7 conv=notrunc
sudo dd if=tem_file/vexpress-v2p-ca9.dtb of=${LOOPDEV}p3 conv=notrunc
sudo dd if=tem_file/rootfs.ext4 of=${LOOPDEV}p9 conv=notrunc

# rootfs是ext4格式,为了能让磁盘空间占满,这里我们进行resize
sudo resize2fs -f ${LOOPDEV}p9

# 可以使用下面挂载copy的方式进行rootfs的创建,这里我们采用上面的dd方式
# # 创建临时挂载目录,用来像分区中copy数据
# mkdir tem_rootfs_a
# mkdir tem_userdata
# # 挂载rootfs_a和userdata分区
# sudo mount -t ext4 ${LOOPDEV}p7 ./tem_rootfs_a -o loop
# sudo mount -t ext4 ${LOOPDEV}p9 ./tem_userdata -o loop
# sudo cp -rf rootfs-arm/* ./tem_rootfs_a
# sudo umount ./tem_rootfs_a
# sudo umount ./tem_userdata

# 取消回环设备
sudo losetup -d $LOOPDEV
# rmdir ./tem_rootfs_a ./tem_userdata 

上面其他命令对应都在代码中进行了相应的注释,这里不在过多的阐述,我们来解释一下上面 mkenvimage -s 524288 -o tem_file/env.img $ROOT_PATH/etc/uboot_env.txt这条制作uboot镜像的命令的含义:
其中-s用来指定制作的uboot环境变量分区的大小(env.img),因为我们在进行分区划分的时候划分的为512k(sgdisk -n 0:0:+512k -c 0:ubootenv vexpress_ab.img),512k=512*1024=524288字节,因此在这里我们制作的uboot环境变量的大小也为512k。

注意:上面镜像中未包含uboot,这是因为我们qemu需要重uboot启动,需要手动指定uboot镜像,因此在AB分区中,我们不制作uboot镜像,另外vbmeta用作安全的,目前我们还未使用到,因此这里暂做保留。

然后运行./script/make_AB_img.sh 制作AB分区镜像。
在这里插入图片描述
运行完成之后,会在out/ab_img/目录下生vexpress_ab.img镜像文件。
在这里插入图片描述
使用sgdisk查看镜像文件:
在这里插入图片描述
可以看到,和我们制作时候指定镜像大小是一致的。

3、uboot_env.txt中环境变量的含义
现在我们已经将镜像制作出来了,现在我们就可以来深究一下上面uboot_env.txt中环境变量的含义了,为什么这么设置,以及为什么要设置为这些值。

首先是boot_cmd:我们设置的值为:bootcmd=mmc read 0x60003000 0x3800 0x10000;mmc read 0x60500000 0x1800 0x400;bootm 0x60003000 - 0x60500000
在uboot运行时候,会自动运行bootcmd的值命令进行内核启动,我们在bootcmd中也就是设置启动参数。

mmc read 0x60003000 0x3800 0x10000 解释
这条命令的意思是从emmc的0x3800块地址处读取0x10000块数据到0x60003000内存中。这里其实就是读取kernel的镜像,为什么呢?
使用sgdisk -p 命令可以看到制作分区情况,也就是在上面图中,我们可以看到,boot_a的起始块地址为14336,注意这是块地址,每块是512字节,而我们mmc read命令中需要的就是块地址,因此我们这里在使用mmc read读取地址就是14336,将其转换为16进制就是0x3800,
从上图分区情况我们还可以知道,boot_a分区大小为:32M=321024k=3210241024=33554432字节=321024*1024/512=65,536块,转换为16进制为:0x1 0000块,所以上面最后一个参数为0x1 0000
至于为什么将kernel内容读到内存0x60003000这个地址出,这是因为我们在编译kernel的时候指定了其链接地址为0x60003000,忘记了的可以参考之前的文章:Qemu开发ARM篇-4、kernel交叉编译运行演示

mmc read 0x60500000 0x1800 0x400 解释
这条命令意思和上面kernel差不多,这里就快速过一下:
dtb_a起始块地址:6144=0x1800
dtb_a分区大小:512k=5121024字节=5121024/512块=1024块=0x400块
0x60500000 :这里不将kernel覆盖掉的地址理论都可以,这里设置为:0x60500000

bootm 0x60003000 - 0x60500000 解释
这条命令是启动kernel的标准命令,前面是内核的地址,后面的dtb的地址,都是上面我们进行指定的。

然后是boot_args:bootargs=root=/dev/mmcblk0p9 init=/usr/sbin/init console=ttyAMA0

bootargs的参数会传递给内核,用于挂载根文件系统以及指定系统初始化程序,这里根文件系统位于/dev/mmcblk0p9分区,初始化程序选择/usr/sbin/init,这个其实就是systemd,我们在制作根文件系统选择的,如果忘记的可以参考之前的文章:Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

2、uboot修改

因为我们将环境变量设置在了分区2,因此我们需要对uboot进行配置,告诉uboot在哪里去获取环境变量:
运行我们之前编译uboot的脚本:./script/build_uboot.sh进入到图形配置界面:

1、找到环境变量配置选项
在这里插入图片描述
选项配置如下:
在这里插入图片描述
取消掉in flash选项,选中in mmc选项,然后修改环境变量偏移为:0x200000,这是因为我们环境变量起始块地址为:4096块=4096512=2,097,152字节=0x200000,因此偏移为:0x200000
环境变量size设置为0x80000这是因为我们环境变量大小为512k=512
1024=524,288字节=0x80000,因此大小为:0x80000
下面分区设备以及分区号都填0,因为我们上面偏移都是从0开始计算的。

设置好之后,保持配置,为了不用每次都进行配置,我们将该配置进行保存,并替换原配置文件,这样我们就不用每次都进行配置了,使用如下命令保存该配置:

cp ./src/uboot/u-boot-2022.07-rc3/configs/vexpress_ca9x4_defconfig ./src/uboot/u-boot-2022.07-rc3/configs/vexpress_ca9x4_defconfig_bak
cp ./out/u-boot-arm/.config ./src/uboot/u-boot-2022.07-rc3/configs/vexpress_ca9x4_defconfig

这样我们下次再编译的时候就会使用我们刚刚配置的配置了。

3、镜像启动

1、uboot信息确认

编译完新的uboot以及制作完分区镜像之后,我们在script目录使用touch run_uboot_with_img.sh && chmod 777 run_uboot_with_img.sh命令创建启动脚本,并在启动脚本输入如下内容:

#!/bin/bash
qemu-system-arm  -M vexpress-a9 -m 512M  -kernel ~/project/qemu/out/u-boot-arm/u-boot -nographic -no-reboot -sd out/ab_img/vexpress_ab.img

然后运行./script/run_uboot_with_img.sh启动uboot: 启动是按下回车先看看uboot内部情况。
在这里插入图片描述
可以看到环境变量加载成功,使用printenv查看一下环境变量是不是我们刚才设置的:
在这里插入图片描述
了可以看到环境变量和我们上面设置的一致,在看看其他内容。

在uboot中使用mmcinfo查看磁盘情况:
在这里插入图片描述
可以看到容量为8G和我们制作大小一致,使用mmc part查看分区情况:
在这里插入图片描述
可以看到分区信息也和我们指定的一致:

使用ls mmc 0:9查看rootfs_a内容情况:
在这里插入图片描述
可以看到里面内容正是我们制作的根文件系统。

2、启动
当上面一切都正常后,使用run bootcmd启动内核,看能否正常进入系统:
在这里插入图片描述
可以看到已经成功启动了内核并成功挂载了根文件系统并进入了系统。
在这里插入图片描述

下一次uboot启动时,不要按回车,uboot就会自动运行bootcmd命令,并启动内核进入系统。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

车载应用的多功能需求与公安、金融等行业的应用特点

随着科技的快速发展,车载应用的功能需求也日益多样化。除了基本的视频监控功能外,现代车载应用还需满足一系列高级功能,如无线网络视频监控、GPS卫星定位、车辆调度、语音报站、行驶信息记录以及多媒体娱乐广告播放等。这些功能在公安、金融等…

2024年数字化转型与管理国际学术会议(DTM 2024)

目录 重要信息 大会简介 大会组委 征稿主题 论文出版 会议议程 参会方式 重要信息 大会官网:www.icemme.org(点击了解大会,投稿等详细信息) 大会时间:2024年11月22-24日 大会地点:中国-大连 大会…

三维重建的几何评价指标

1.三维重建的几何评价指标 1.1 Chamfer Distance Geometry quality (1) Chamfer Distance(CD) CD衡量两组点云之间的几何差异,距离越小越好。 CD是一种用于衡量两个点云之间相似度的常用几何评价指标。它计算一个点云中每个点到另一个点云的…

Qt5.15和Qt6.7配置Android开发环境

最近重新安装了Qt5.15.2和Qt6.7.2,使用Qt Creator14.0.1,配置Android开发环境时又碰到了一些问题,记录如下。 1、Qt6.7.2使用AndroidStudio的JDK 因为系统原来安装了AndroidStudio2024,系统自动检测了JDK位置,点击设置SDK,可以自动安装好相应的NDK。 打开Qt Creator14…

JavaEE——多线程的状态及线程安全问题

目录 一、线程的状态 1、NEW 2、 TERMINATED 3、RUNNABLE 4、TIMED_WAITING 5、 BLOCKED 6、WAITING 二、线程安全问题 1、线程不安全的原因 2、一个线程不安全的实例 3、加锁操作 4、产生线程不安全的原因 什么是内存可见性呢? 解决方案? 5、指令重排序…

【Linux学习】1-2 新建虚拟机ubuntu环境

1.双击打开VMware软件,点击“创建新的虚拟机”,在弹出的中选择“自定义(高级)” 2.点击下一步,自动识别ubuntu光盘映像文件,也可以点击“浏览”手动选择,点击下一步 3.设置名称及密码后&#xf…

web - RequestResponse

##Request&Response 1,Request和Response的概述 Request是请求对象,Response是响应对象。这两个对象在我们使用Servlet的时候有看到: 此时,我们就需要思考一个问题request和response这两个参数的作用是什么? request:获取请…

基于微信小程序的竞赛答题小程序开发笔记(一)

开发背景调研 中小学学科答题小程序,适合各中小学校方,老师或者家长。通过互动和参与式学习,小程序能够通过游戏化元素提升学习的积极性和参与度,从而提升学习效率,促进学生自主学习 功能规划 分类题库:…

专题八_链表_算法专题详细总结

目录 链表 1.常用技巧 1)画图!!! -> 直观 形象 便于我们理解 2)引入虚拟“头”节点 1.便于处理边界条件 2.方便我们对链表进行操作 3.不要吝啬空间,大胆定义变量 4.快慢双指针 1.判断链表是否…

redis学习(014 实战:黑马点评:优惠券秒杀——1人只可以下1单问题解决方案)

黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第54p-第p55的内容 文章目录 一人一单问题分析第一种写法 查询后进行添加第二种写法 加悲观锁在用户上加悲观锁(提…

Vue 响应式监听 Watch 最佳实践

一. 前言 上一篇文章我们学习了 watch 的基础知识,了解了它的基本使用方法及注意事项,本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章: 详解 Vue 中 Watch 的使用方法及注意事项https://bl…

53 语言模型(和之后用来训练语言模型的数据集)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录理论部分使用计数来建模N元语法总结 代码读取长序列数据随机采样顺序分区 小结练习 理论部分 在上一部分中,我们了解了如何将文本数据映射为词元,以及将这些词元可以视为一系列离散的观测,例如单词或字符…

(务必收藏)推荐市面上8款AI自动写文献综述的网站

在当前的学术研究和论文写作中,AI技术的应用已经变得越来越普遍。特别是在文献综述这一环节,AI工具能够显著提高效率并减少人工劳动。以下是市面上8款推荐的AI自动写文献综述的网站: 一、千笔-AIPassPaper 是一款备受好评的AI论文写作平台&…

java 框架组件

Java 框架是一系列预先编写好的、可复用的软件组件,它们旨在帮助开发者快速构建高质量的应用程序。Java 社区拥有众多优秀的框架,涵盖了从 Web 开发到大数据处理的各个领域。下面是一些流行的 Java 框架及其主要用途: Spring框架:…

基于丹摩智算部署SD3+ComfyUI文生图详解

目录 丹摩智算简介SD3ComfyUI文生图简介 SD3ComfyUI文生图部署步骤1.1、实例创建 操作步骤从HF-mirror下载SD3模型安装git安装ComfyUI 丹摩智算简介 丹摩智算官网:https://www.damodel.com/home 丹摩智算(DAMODEL)是一款专为AI应用打造的智…

网红挣钱太容易了

你看最近这个三只羊小Y哥,因为月饼质量问题、因为大闸蟹的问题,上了好多次热搜,掉粉了几百万。还是有很多人在赶着要买他们家的东西。 你是他的粉丝,他是你的屠夫。只要冠以“全网最低价”的名号,就会有无数的粉丝跑过…

应用层协议 --- HTTP

序言 在上一篇文章中,我们在应用层实现了一个非常简单的自定义协议,我们在我们报文的首部添加了报文的长度并且使用特定的符号分割。但是想做一个成熟,完善的协议是不简单的,今天我们就一起看看我们每天都会用到的 HTTP协议 。 UR…

华语童声璀璨新星陈千言、陈万语闪耀荣登2024年度最受媒体欢迎女歌手

华语童声璀璨新星陈千言、陈万语闪耀荣登2024年度最受媒体欢迎女歌手 近日,华语乐坛传来一则令人振奋的消息,11 岁的双胞胎姐妹花陈千言和陈万语荣获 2024 华语童声最受媒体欢迎女歌手和第 15 届华语金曲奖优秀童星两项大奖! 陈千言和陈万语…

前缀和(2)_【模板】二维前缀和_模板

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 前缀和(2)_【模板】二维前缀和_模板 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目…

centos磁盘逻辑卷LVM创建

centos磁盘逻辑卷LVM创建 一、磁盘逻辑卷LVM说明二、centos磁盘使用情况三、LVM安装指南1.LVM工具安装1. yum list lvm2. yum search lvm3. yum search pvcreate4. yum list lvm25. yum install lvm2 2.创建物理卷2.1磁盘情况查看2.2创建物理卷(PV) 3.创…