基于QEMU-aarch64学习UEFI(EDK2)-2安装操作系统

1 基于QEMU-aarch64学习UEFI(EDK2)-2安装操作系统

文章目录

  • 1 基于QEMU-aarch64学习UEFI(EDK2)-2安装操作系统
    • 1.1 二、基于qemu固件安装操作系统
      • 1.1.1 1、virt-manager安装
      • 1.1.2 2、创建虚拟机
        • 1.1.2.1 Ubuntu系统开机等待时间长问题解决
      • 1.1.3 3、virt-manager日常使用
      • 1.1.4 4、更换虚拟机固件
        • 1.1.4.1 4.1、修改固件大小
      • 1.1.5 5、virt-manager转为qemu命令启动虚拟机
        • 1.1.5.1 精简启动命令
        • 1.1.5.2 挂载ISO命令
        • 1.1.5.3 替换UEFI路径
        • 1.1.5.4 解决自己编译的QEMU固件报错问题
        • 1.1.5.5 问题原因
      • 1.1.6 6、最终命令
      • 1.1.7 7、小结
      • 1.1.8 8、基于ATF固件引导OS

1.1 二、基于qemu固件安装操作系统

1.1.1 1、virt-manager安装

UEFI固件编译完成后,我们使用qemu-system-aarch64程序,手动输入命令运行了QEMU_EFI.fd固件,其实就是相当于创建了一个虚拟机,因为qemu-system-aarch64收到输命令创建设备麻烦,现在我们使用virt-manager调用我们的QEMU_EFI.fd固件,安装aarch64的操作系统。

如果没有安装virt-manager,可以通过命令安装软件,sudo apt install virt-manager

image-20230228131306476

安装完成后运行程序。

image-20230228131334327

1.1.2 2、创建虚拟机

我们创建一个虚拟机,可以看到调用的两个固件路径分别是/usr/share/AAVMF/AAVMF_CODE.fd/var/lib/libvirt/qemu/nvram/centos8-aarch64_VARS.fd

image-20230228151335111

我们把这个固件重命名一下是无法打开的,所以我们可以确定是该固件。

image-20230228151449595

接着我们先用默认的固件测试安装操作系统,这里以openEuler-22.03测试。

image-20230228151738158

image-20230228151749505

openEuler安装过程内存较小,启动很慢。内存设置4G大小,重新安装可以进入安装界面。

image-20230320104350358

我们换Ubuntu22.04安装。

image-20230301131925990

image-20230301162617578

image-20230301162627198

image-20230301162639422

image-20230301162705254

设置用户名密码

image-20230301162752605

image-20230301163123342

image-20230301200933845

安装完成后,可以进入系统且登录:

image-20230301132507073

lspci查看设备,

image-20230301132652762

dmidecode -t0查看bios信息,是2015年的。

image-20230301132704171

1.1.2.1 Ubuntu系统开机等待时间长问题解决

安装Ubuntu22.04会卡在systemd-networkd-wait-online服务超时这里,等待2分多钟,我们进入系统修改一下超时时间。

image-20230301133022957

sudo systemctl edit systemd-networkd-wait-online.service  
#输入  
[Service] 
TimeoutStartSec=3

image-20230301133132011

保存后会在下面这个路径生成一个override.conf文件。

image-20230301133925818

然后重启,即可解决。

1.1.3 3、virt-manager日常使用

虚拟机创建完成,我们日常使用,可以通过virsh来开启关闭虚拟机。

image-20230301134916213

我们关闭虚拟机后,可以通过sudo virsh list --all命令查看所有虚拟机。

然后开机命令是:sudo virsh start centos8-aarch64

连接虚拟机:sudo virsh console centos8-aarch64

image-20230301135708331

ctrl+]退出

开机的时候连接虚拟机:sudo virsh start centos8-aarch64 --console

image-20230301140307079

1.1.4 4、更换虚拟机固件

虚拟机创建完成后,我们可以正常进入系统,下面更换我们自己的固件。

sudo virsh edit centos8-aarch64

打开配置文件把pflash修改一下。

image-20230301140358086

修改为:

image-20230301140447833

然后重启虚拟机。

image-20230301140621139

sudo virsh start centos8-aarch64 --console

image-20230301140717999

发现直接替换报错,记录了大小。

1.1.4.1 4.1、修改固件大小

修改固件大小,参考

https://blog.csdn.net/weixin_42758299/article/details/115460776

$sudo qemu-img info /work/study/uefistudy/edk2-202211/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd
image: /work/study/uefistudy/edk2-202211/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd
file format: raw
virtual size: 2 MiB (2097152 bytes)
disk size: 2 MiB

$ qemu-img resize -f raw /work/study/uefistudy/edk2-202211/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd 64M
Image resized.
$ 

可以看到虚拟大小变为了64M,我们再启动虚拟机。

image-20230301142006155

sudo virsh start centos8-aarch64 --console

image-20230301142457308

可以看到程序已经在运行了,这个是我们的应用程序,因为前面太快,没有输出bios阶段的信息,重启就会发现是我们的UEFI程序。

image-20230301142527877

但是这样感觉不方便,还是得回去研究qemu-system-aarch64命令启动速度快方便调试。

1.1.5 5、virt-manager转为qemu命令启动虚拟机

因为我最开始尝试用qemu命令自己创建虚拟机,结果发现无法引导系统,才采用virt-manager方式管理,现在反过来我把virt-manager的虚拟机配置文件转换为qemu命令看看。

首先查看我们的虚拟机,命令sudo virsh list

image-20230301134438661

看到我们的虚拟机名称为“centos8-aarch64”,这就是上面我们创建的虚拟机名称。

接着我们把这个虚拟机的xml文件导出,使用命令:sudo virsh dumpxml centos8-aarch64 > centos8-aarch64.xml

image-20230301134615951

最后我们把xml文件转为qemu参数,命令:sudo virsh domxml-to-native qemu-argv centos8-aarch64.xml

image-20230301134655745

结果发现命令很多参数,如果嫌麻烦可以继续使用virt-manager管理。

image-20230301134732929

经过研究,可以引导系统的命令如下:

sudo qemu-system-aarch64 \
-blockdev '{"driver":"file","filename":"/usr/share/AAVMF/AAVMF_CODE.fd","node-name":"libvirt-pflash0-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-pflash0-format","read-only":true,"driver":"raw","file":"libvirt-pflash0-storage"}'  \
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/qemu/nvram/centos8-aarch64_VARS.fd","node-name":"libvirt-pflash1-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-pflash1-format","read-only":false,"driver":"raw","file":"libvirt-pflash1-storage"}' \
-machine virt-4.2,accel=tcg,usb=off,dump-guest-core=off,gic-version=2,pflash0=libvirt-pflash0-format,pflash1=libvirt-pflash1-format \
-cpu cortex-a57 -m 1536 -overcommit mem-lock=off -smp 2,sockets=2,cores=1,threads=1 -uuid f02ab96c-f3ba-4b0c-8bc6-e29598906c1c \
-display none -no-user-config -nodefaults \
-rtc base=utc -no-shutdown -boot strict=on \
-device pcie-root-port,port=0x8,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,addr=0x1 \
-device pcie-root-port,port=0x9,chassis=2,id=pci.2,bus=pcie.0,addr=0x1.0x1 \
-device pcie-root-port,port=0xa,chassis=3,id=pci.3,bus=pcie.0,addr=0x1.0x2 \
-device pcie-root-port,port=0xb,chassis=4,id=pci.4,bus=pcie.0,addr=0x1.0x3 \
-device pcie-root-port,port=0xc,chassis=5,id=pci.5,bus=pcie.0,addr=0x1.0x4 \
-device pcie-root-port,port=0xd,chassis=6,id=pci.6,bus=pcie.0,addr=0x1.0x5 \
-device pcie-root-port,port=0xe,chassis=7,id=pci.7,bus=pcie.0,addr=0x1.0x6 \
-device pcie-root-port,port=0xf,chassis=8,id=pci.8,bus=pcie.0,addr=0x1.0x7 \
-device pcie-root-port,port=0x10,chassis=9,id=pci.9,bus=pcie.0,addr=0x2 \
-device pcie-pci-bridge,id=pci.10,bus=pci.8,addr=0x0 \
-device qemu-xhci,p2=15,p3=15,id=usb,bus=pci.2,addr=0x0 \
-device virtio-scsi-pci,id=scsi0,bus=pci.3,addr=0x0 \
-device virtio-serial-pci,id=virtio-serial0,bus=pci.4,addr=0x0 \
-blockdev '{"driver":"file","filename":"/work/study/uefistudy/arm64-os.img","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"qcow2","file":"libvirt-2-storage","backing":null}' \
-device virtio-blk-pci,scsi=off,bus=pci.5,addr=0x0,drive=libvirt-2-format,id=virtio-disk0,bootindex=1 \
-blockdev '{"driver":"file","filename":"/work/jammy-live-server-arm64.iso","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-1-format","read-only":true,"driver":"raw","file":"libvirt-1-storage"}' \
-device scsi-cd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,device_id=drive-scsi0-0-0-0,drive=libvirt-1-format,id=scsi0-0-0-0 \
-device virtio-gpu-pci,id=video0,bus=pci.10,addr=0x1 \
-device virtio-balloon-pci,id=balloon0,bus=pci.6,addr=0x0 \
-msg timestamp=on \
-serial stdio \

这里需要修改的有操作系统镜像位置、硬盘位置,即qemu-img create -f qcow2 arm64-os.img 20G命令创建的文件。

安装完成系统后的arm64-os.img大小如下:

image-20230301201342968

1.1.5.1 精简启动命令
sudo qemu-system-aarch64 -name guest=centos8-aarch64,debug-threads=on \
-blockdev '{"driver":"file","filename":"/usr/share/AAVMF/AAVMF_CODE.fd","node-name":"libvirt-pflash0-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-pflash0-format","read-only":true,"driver":"raw","file":"libvirt-pflash0-storage"}'  \
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/qemu/nvram/centos8-aarch64_VARS.fd","node-name":"libvirt-pflash1-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-pflash1-format","read-only":false,"driver":"raw","file":"libvirt-pflash1-storage"}' \
-machine virt-4.2,accel=tcg,usb=off,dump-guest-core=off,gic-version=2,pflash0=libvirt-pflash0-format,pflash1=libvirt-pflash1-format \
-cpu cortex-a57 -m 1536 -overcommit mem-lock=off -smp 2,sockets=2,cores=1,threads=1 -uuid f02ab96c-f3ba-4b0c-8bc6-e29598906c0c \
-nodefaults \
-device qemu-xhci -device usb-kbd \
-device virtio-gpu-pci \
-serial stdio \
-device usb-mouse \
-device virtio-scsi-pci,id=scsi0 \
-drive if=none,format=qcow2,file=/work/study/uefistudy/arm64-os.img,id=hd0 \
-device scsi-hd,bus=scsi0.0,lun=1,drive=hd0 \
1.1.5.2 挂载ISO命令
sudo qemu-system-aarch64 -name guest=uefi-study,debug-threads=on \
-blockdev '{"driver":"file","filename":"/usr/share/AAVMF/AAVMF_CODE.fd","node-name":"libvirt-pflash0-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-pflash0-format","read-only":true,"driver":"raw","file":"libvirt-pflash0-storage"}'  \
-blockdev '{"driver":"file","filename":"/var/lib/libvirt/qemu/nvram/centos8-aarch64_VARS.fd","node-name":"libvirt-pflash1-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-pflash1-format","read-only":false,"driver":"raw","file":"libvirt-pflash1-storage"}' \
-machine virt-4.2,accel=tcg,usb=off,dump-guest-core=off,gic-version=2,pflash0=libvirt-pflash0-format,pflash1=libvirt-pflash1-format \
-cpu cortex-a57 -m 1536 -overcommit mem-lock=off -smp 2,sockets=2,cores=1,threads=1  \
-nodefaults \
-device qemu-xhci \
-device usb-kbd \
-device virtio-gpu-pci \
-serial stdio \
-device usb-mouse \
-device virtio-scsi-pci,id=scsi0 \
-drive if=none,format=qcow2,file=/work/study/uefistudy/arm64-os.img,id=hd0 \
-device scsi-hd,bus=scsi0.0,lun=1,drive=hd0 \
-drive if=none,format=raw,file=/work/jammy-live-server-arm64.iso,id=cd0 \
-device scsi-cd,bus=scsi0.0,lun=0,drive=cd0 \

image-20230306145220813

1.1.5.3 替换UEFI路径

使用5.1中的命令,仅修改uefi路径,结果报错,我们重新修改qemu_efi的文件大小

image-20230306145652651

sudo qemu-img resize -f raw QEMU_VARS.fd 64M

然后重新运行,直接进入shell,无法引导系统。

sudo qemu-system-aarch64 -name guest=uefi-study,debug-threads=on \
-blockdev '{"driver":"file","filename":"/work/study/uefistudy/edk2-202211/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd","node-name":"libvirt-pflash0-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-pflash0-format","read-only":true,"driver":"raw","file":"libvirt-pflash0-storage"}'  \
-blockdev '{"driver":"file","filename":"/work/study/uefistudy/edk2-202211/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_VARS.fd","node-name":"libvirt-pflash1-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-pflash1-format","read-only":false,"driver":"raw","file":"libvirt-pflash1-storage"}' \
-machine virt-4.2,accel=tcg,usb=off,dump-guest-core=off,gic-version=2,pflash0=libvirt-pflash0-format,pflash1=libvirt-pflash1-format \
-cpu cortex-a57 -m 1536 -overcommit mem-lock=off -smp 2,sockets=2,cores=1,threads=1  \
-nodefaults \
-device qemu-xhci -device usb-kbd \
-device virtio-gpu-pci \
-serial stdio \
-device usb-mouse \
-device virtio-scsi-pci,id=scsi0 \
-drive if=none,format=qcow2,file=/work/study/uefistudy/arm64-os.img,id=hd0 \
-device scsi-hd,bus=scsi0.0,lun=1,drive=hd0 \

image-20230306150246646

然后回过头找原因,我们使用最简单的命令启动我们安装好的系统,其中固件路径是安装包自带的。

sudo qemu-system-aarch64 \
 -m 1G -cpu cortex-a57 -M virt  -smp cpus=2 \
 -bios /usr/share/AAVMF/AAVMF_CODE.fd \
 -device virtio-gpu-pci \
 -device qemu-xhci \
 -device usb-kbd \
 -device usb-mouse \
 -device virtio-scsi-pci,id=scsi0 \
 -drive if=none,format=qcow2,file=/var/lib/libvirt/images/centos8-aarch64.qcow2,id=hd0 \
 -device scsi-hd,bus=scsi0.0,lun=1,drive=hd0 \
 -serial stdio \

发现可以启动操作系统,那么,这样的话,就是我自己编译的UEFI固件有问题。

1.1.5.4 解决自己编译的QEMU固件报错问题

我们的报错:

Synchronous Exception at 0x0000000092ED8428
...
...
PC 0x0000478BDFEC (0x0000478A4000+0x00019FEC) [ 1] DxeCore.dll
PC 0x0000BC7103EC
...
PC 0x0000478BDFEC (0x0000478A4000+0x00019FEC) [ 1] DxeCore.dll
PC 0x0000BFCE4370 (0x0000BFCD4000+0x00010370) [ 2] BdsDxe.dll
PC 0x0000BFCE6104 (0x0000BFCD4000+0x00012104) [ 2] BdsDxe.dll
PC 0x0000478C0C28 (0x0000478A4000+0x0001CC28) [ 3] DxeCore.dll
[ 1] /work/study/uefistudy/edk2-202211/Build/ArmVirtQemuStudy/DEBUG_GCC5/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll
[ 2] /work/study/uefistudy/edk2-202211/Build/ArmVirtQemuStudy/DEBUG_GCC5/AARCH64/MdeModulePkg/Universal/BdsDxe/BdsDxe/DEBUG/BdsDxe.dll
[ 3] /work/study/uefistudy/edk2-202211/Build/ArmVirtQemuStudy/DEBUG_GCC5/AARCH64/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/DxeCore.dll

...
 ESR : EC 0x21  IL 0x1  ISS 0x0000000E

Instruction abort: Permission fault, second level

Stack dump:
...
ASSERT [ArmCpuDxe] /work/study/uefistudy/edk2-202211/edk2/ArmPkg/Library/DefaultExceptionHandlerLib/AArch64/DefaultExceptionHandler.c(333): ((BOOLEAN)(0==1))

image-20230321164651215

继续分析问题,我们下载最新的Ubuntu edk2源代码包,https://packages.ubuntu.com/source/lunar/edk2

image-20230317141420757

其源码也是edk2-stable202211,与我们使用的一致,但是编译时候多了一些规则,我们参考看看。

image-20230317142313973

查看rule里面的编译命令,发现多了一些define宏定义。

image-20230320092051588

但是我们编译,结果同样无法引导系统。

继续查找,发现在Debian文件夹中的patches中有一些patch。

image-20230320105150252

我们大胆猜测,小心求证,把patch中的变量自己修改一下,由0xC000000000007FD5改为0xC000000000007FD5,如下图,然后我们重新编译固件,运行qemu。

gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy|0xC000000000007FD1

运行命令:

 sudo qemu-system-aarch64 \
 -m 4G -cpu cortex-a57  -M virt  -smp cpus=2 \
 -bios /work/study/uefistudy/edk2-202211/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd \
 -device virtio-gpu-pci \
 -device qemu-xhci \
 -device usb-kbd \
 -device usb-mouse \
 -device virtio-scsi-pci,id=scsi0 \
 -drive if=none,format=raw,file=/work/openEuler-22.03-LTS-aarch64-dvd.iso,id=cd0 \
 -device scsi-cd,bus=scsi0.0,lun=0,drive=cd0 \
 -serial stdio \

发现居然可以引导系统了。

然后换回加载我们之前安装好的系统盘,不加载光驱,命令如下,发现我硬盘引导项,继续查找原因。

 sudo qemu-system-aarch64 \
 -m 4G -cpu cortex-a57  -M virt  -smp cpus=2 \
 -bios /work/study/uefistudy/edk2-202211/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd \
 -device virtio-gpu-pci \
 -device qemu-xhci \
 -device usb-kbd \
 -device usb-mouse \
 -device virtio-scsi-pci,id=scsi0 \
 -drive if=none,format=qcow2,file=/work/study/uefistudy/arm64-os.img,id=hd0 \
 -device scsi-hd,bus=scsi0.0,lun=1,drive=hd0 \
 -serial stdio \

image-20230320105510024

map -r命令也不行,

image-20230320105541476

继续找原因,我们升级edk2到stable202302看看。

image-20230320110255152

然后发现我们上面修改的patch仍然没有合并,所以我们手动修改:

image-20230320110329604

编译完成后,我们引导系统,发现可以正常进入。

 sudo qemu-system-aarch64 \
 -m 4G -cpu cortex-a57  -M virt  -smp cpus=2 \
 -bios /work/study/uefistudy/edk2-202211/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd \
 -device virtio-gpu-pci \
 -device qemu-xhci \
 -device usb-kbd \
 -device usb-mouse \
 -device virtio-scsi-pci,id=scsi0 \
 -drive if=none,format=qcow2,file=/work/study/uefistudy/arm64-os.img,id=hd0 \
 -device scsi-hd,bus=scsi0.0,lun=1,drive=hd0 \
 -serial stdio \

image-20230320110510437

所以我们后续以edk2-stable202302为基础代码进行修改。

提交一下代码:

image-20230320111125274

1.1.5.5 问题原因

分析PcdDxeNxMemoryProtectionPolicy变量,是设置内存保护策略,EfiLoaderData位表示EfiLoaderData内存类型数据可以执行,修改后清除EfiLoaderData位,表示不处理该内存类型,grub可以正常引导内核。

image-20230320113721343

image-20230320113940817

我们查看该patch提交时间和原因,如下图:大概意思就是之前GRUB的BUG已经修复,然后现在改回正常状态。

image-20230320131531790

1.1.6 6、最终命令

经过一顿折腾,我们得出结论是EDK2代码的问题,所以后续我们调试命令参考如下:

 sudo qemu-system-aarch64 \
 #CPU、内存相关配置
 -m 4G -cpu cortex-a57  -M virt  -smp cpus=2 \
 #固件路径
 -bios /work/study/uefistudy/edk2-202211/Build/ArmVirtQemu-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd \
 #gpu
 -device virtio-gpu-pci \
 #usb
 -device qemu-xhci \
 -device usb-kbd \
 -device usb-mouse \
 #scsi
 -device virtio-scsi-pci,id=scsi0 \
 #硬盘位置
 -drive if=none,format=qcow2,file=/work/study/uefistudy/arm64-os.img,id=hd0 \
 -device scsi-hd,bus=scsi0.0,lun=1,drive=hd0 \
 #本地文件夹映射
 -drive file=fat:rw:./filedir/,media=disk,if=virtio,format=raw \
 #串口
 -serial stdio \

本地文件夹映射需要自己新建一个文件夹,我这里以filedir为例。

image-20230320112855426

进入UEFI的shell可以看到该文件夹的内容,后续我们开发的程序可以直接通过该文件夹映射到UEFI中,使用该方式较方便。

image-20230320112943695

1.1.7 7、小结

至此,我们基于edk2-stable202302版本代码,编译了QEMU_EFI.fd,并通过qemu-system-aarch64程序加载了UEFI,最后成功引导了aarch64的操作系统。后续我们基于此进行EDK2的程序开发学习。

1.1.8 8、基于ATF固件引导OS

ARM架构安全启动安装ATF流程,我们之前单纯启动的是BL33阶段的UEFI,下面我们试一下加入ATF固件。

下载ATF代码:

git clone https://github.com/ARM-software/arm-trusted-firmware.git

使用一个最新的归档版本,如V2.8。

image-20230320135023177

参考下面链接进行编译,这里用到的QEMU是ArmVirtPkg/ArmVirtQemuKernel.dsc文件。

https://github.com/ARM-software/arm-trusted-firmware/blob/master/docs/plat/qemu.rst

我们首先编译UEFI,在UEFI-TOOLS中添加一个模块。

image-20230320141842792

image-20230320141803184

然后开始编译./uefi-tools/edk2-build.sh -b DEBUG armvirtqemukernel

进入目录开始编译ATF固件:

make BL33=/work/study/uefistudy/edk2-202211/Build/ArmVirtQemuKernel-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd \
CROSS_COMPILE=aarch64-linux-gnu- \
PLAT=qemu \
all fip \
#调试等级按需设置
DEBUG=1 LOG_LEVEL=50 \

image-20230320140019939

编译完成在build/qemu/release生成bl1.binfip.bin,此时需要将这两个固件合成一个,作为BIOS启动。

image-20230320140031315

dd if=bl1.bin of=flash.bin bs=4096 conv=notrunc
dd if=fip.bin of=flash.bin seek=64 bs=4096 conv=notrunc

image-20230320140133378

启动固件,用下面命令,多了一个serure=on其他同之前的命令。

 qemu-system-aarch64  \
-machine virt,secure=on \
-device virtio-gpu-pci \
-cpu cortex-a57 \
-smp 2 \
-m 1024 \
-bios /work/study/uefistudy/arm-trusted-firmware/build/qemu/release/flash.bin \
-d unimp \
-serial stdio \
-device qemu-xhci \
-device usb-kbd \
-device virtio-scsi-pci,id=scsi0 \
-drive if=none,format=qcow2,file=/work/study/uefistudy/arm64-os.img,id=hd0 \
-device scsi-hd,bus=scsi0.0,lun=1,drive=hd0 \

image-20230320142046071

可以看到BIOS固件正常启动,且打印BL1和BL2 BL31阶段的信息。

同样可以进入操作系统

image-20230320142416274

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GAN实例基于神经网络

目录 1.前言 2.实验 1.前言 需要了解GAN的原理查看对抗生成网络(GAN),DCGAN原理。 采用手写数字识别数据集 2.实验 import argparse import os import numpy as np import mathimport torchvision.transforms as transforms from torchvi…

怎么把照片变小做头像?多种方法教你图片改尺寸

现在在社交媒体平台或者是社交软件上,我们经常会去更改头像来展示自己,但是有时候我们拍摄的照片太大无法直接用作头像,这时候就需要去修改图片尺寸,将图片改大小到合适的数值才能使用,那么如何快速的将图片改大小呢&a…

在UBuntu上安装QT环境

一、UBuntu环境 二、官网下载QT https://download.qt.io/archive/qt/ 安装所需选择版本下载,可以现在windows下载在复制进去 三、安装QT 1、复制到ubuntu 2、打开终端,改变刚下载文件的权限 权限代号 r:读取权限,数字代号为 “…

手机图片恢复不求人:手动找回丢失的照片!

无论是外出旅行、聚会还是日常点滴,我们总是习惯用手机记录下来,让美好的瞬间定格在一张张照片中。然而,有时因为误删、清空缓存或是更换手机,那些珍贵的照片突然消失了。手机图片恢复有什么简单易行、容易上手的方法吗&#xff1…

MySQL创建存储过程函数(2)

DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL,userName varchar(20) DEFAULT NULL,pwd varchar(36) DEFAULT NULL,phone varchar(11) DEFAULT NULL,age tinyint(3) DEFAULT NULL,sex char(2) DEFAULT NULL,i…

上海初中生古诗文大会倒计时4个月:单选题真题示例和独家解析

现在距离2024年初中生古诗文大会还有4个多月时间,备考要趁早,因为知识点还是相对比较多的。这些知识点对于初中语文的学习也是很有帮助的。 今天我们继续来看10道选择题真题和详细解析,以下题目截取自我独家制作的在线真题集,都是…

教你五行代码实现大批量文件重命名

问题背景 文件夹里的大量文件,命名很乱,并且要重新命名为固定长度顺序的文件很麻烦。这里采用5行python实现大批量文件按要求统一命名。 现有文件夹列表 tulips 代码实现 main.py import os path rtulips/ for num, file in enumerate(os.listdir(…

狙击策略专用术语以及含义,WeTrade3秒讲解

想必各位交易高手对狙击策略不会陌生吧!但你想必不知道狙击策略的开发者为了推广狙击策略,在狙击策略基础的经典技术分析理论引入了自己的术语。今天WeTrade众汇和各位投资者继续了解狙击策略专用术语以及含义。 一.BL 银行级别(BL)是前一日线收盘的级别。时间是格…

央视的AI动画《AI我中华》宣传视频,原来用AI工具Stable Diffusion制作,竟然这么简单?

大家好,我是向阳。 前段时间,央视的《爱我中华》AI宣传短片火爆全网,有一个穿越转场效果非常惊艳!先来回顾回顾: 今天就先来详细讲解,如何利用Stable Diffusion制作这样的穿越转场视频。 如你还没有安装St…

脑中风也会出现眩晕?快速识别中风,一定要牢记这些!

眩晕是许多人都会经历的不适感,发作时仿佛整个世界都在旋转,可能还伴随着站立不稳、脚步虚浮、恶心等症状。然而,你可能不知道的是,这些症状在某些情况下可能是脑中风的前兆。如果不及时关注并采取相应措施,一旦发展为…

linux ndk编译搭建测试

一、ndk下载 NDK 下载 | Android NDK | Android Developers 二、ndk环境变量配置 ndk解压: unzip android-ndk-r26d-linux.zip 环境变量配置: export NDK_HOME/rd/own/test/android-ndk-r26d/ export PATH$PATH:$NDK_HOME 三、编译测试验证 …

003_PyCharm的安装与使用

如果你正在学习PyQt,本系列教程完全可以带你入门直至入土。 所谓从零开始,就是从软件安装、环境配置开始。 不跳过一个细节,不漏掉一行代码,不省略一个例图。 IDE 开始学习一个编程语言,我们肯定是首先得安装好它&…

【深度学习】【Lora训练2】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

文章目录 一、如何为图片打标1.1. 打标工具1.1.1. 秋叶中使用的WD1.41.1.2. 使用BLIP21.1.3. 用哪一种 二、 Lora训练数据的要求2.1 图片要求2.2 图片的打标要求 三、 Lora的其他问题qa1qa2qa3qa4qa5 四、 对图片的处理细节4.1. 图片尺寸问题4.2. 图片内容选取问题4.3. 什么是一…

python批量生成防伪识别二维码

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结 一.前言 二维码(QR Code)是一种矩阵条码技术,它使用黑白矩形图案来表示二进制数据,这些矩形图案可以被设备扫描并解读。二维码可以被用来存储

究极完整版!!Centos6.9安装最适配的python和yum,附带教大家如何写Centos6.9的yum.repos.d配置文件。亲测可行!

前言! 这里我真是要被Centos6.9给坑惨了,最刚开始学习linux的时候并没有在意那么的,没有考虑到选版本问题,直到23年下半年,官方不维护Centos6.9了,基本上当时配置的文件和安装的依赖都用不了了&#xff0c…

springboot 引用外配置json文件

场景 一些服务需要记录一些持久化的信息(没有数据库,redis,elasticsearch 可用) 我们就项目启动过程创建一个json 文件去记录工作内容的进程(json 可视化与改动非常方便) 实现效果 代码 application.yml…

HashTable, HashMap, ConcurrentHashMap 三者区别

目录 1. HashMap 2. HashTable 3. ConcurrentHashMap 1. HashMap HashMap 是 Java 中非常常用的一个数据结构,它主要用于存储 键值对(K,V)。 在JDK 1.7中,HashMap的实现是基于 Table数组 和 Entry链表 的组合。 从…

直播卖券有妙招:实景ai无人直播系统帮助商家自动化团购直播!

在数字化浪潮席卷的今天,直播卖券已成为商家推广和营销的重要手段。然而,如何高效、精准地利用直播卖券,让每一位观众都能沉浸在购物的乐趣中,成为商家们迫切需要解决的问题。幸运的是,实景AI无人直播系统应运而生&…

503 SERVICE_UNAVAILABLE “Unable to find instance for ***“的问题。

503 SERVICE_UNAVAILABLE "Unable to find instance for *****"问题 1. 问题描述 在完成网关微服务的配置后,网关能够被Nacos发现并正常运行,但是无法将请求转发到其他微服务。使用Postman进行请求时,返回503错误,而后…

Python程序设计 文件处理(二)

实验十二 文件处理 第1关:读取宋词文件,根据词人建立多个文件 读取wjcl/src/step1/宋词.txt文件, 注意:宋词文件的标题行的词牌和作者之间是全角空格(" ")可复制该空格 在wjcl/src/step3/cr文件夹下根据每…