首页 > 系统相关 >Xen on qemu for arm64: 由qemu-system-aarch64导致的kernel-panic

Xen on qemu for arm64: 由qemu-system-aarch64导致的kernel-panic

时间:2024-09-14 20:55:14浏览次数:13  
标签:kernel set aarch64 xen module chosen fdt qemu

背景描述:

        我在A平台利用qemu实现了xen中dom0的运行,将其移植到B平台运行,dom0的复现遭遇了kernel-panic,在虚拟设备的添加时异常。

一、将运行dom0所需要的可执行文件拷贝到同一个目录

        可执行文件的来源参考Xen On Qemu for arm64_qemu xen-CSDN博客

86d136c3b9ec4e8182a8b0723da71a53.png

二、Kernel-panic现象描述及其解决方法

        在可执行文件的对应目录执行以下命令:

qemu-system-aarch64 -machine virt,gic_version=3 -machine virtualization=true -cpu cortex-a57 -machine type=virt -m 4096 -smp 4 -bios u-boot.bin -device loader,file=xen,force-raw=on,addr=0x49000000 -device loader,file=Image.gz,addr=0x47000000 -device loader,file=virt-gicv3.dtb,addr=0x44000000 -device loader,file=rootfs.img.gz,addr=0x42000000 -nographic -no-reboot -chardev socket,id=qemu-monitor,host=localhost,port=7777,server,nowait,telnet -mon qemu-monitor,mode=readline

        进入uboo界面,等待启动xen:

    8cb3212e76b24a8d97042d89d05b8f02.png

 

        输入以下命令,记得替换0x47000000(linux内核镜像文件)和0x42000000(根文件系统)的大小:

fdt addr 0x44000000
fdt resize
 
fdt set /chosen \#address-cells <1>
fdt set /chosen \#size-cells <1>
 
fdt mknod /chosen module@0
fdt set /chosen/module@0 compatible "xen,linux-zimage" "xen,multiboot-module"
fdt set /chosen/module@0 reg <0x47000000 0x7F2E6A>
fdt set /chosen/module@0 bootargs "rw root=/dev/ram rdinit=/sbin/init earlyprintk=serial,ttyAMA0 console=hvc0 earlycon=xenboot"
fdt mknod /chosen module@1
fdt set /chosen/module@1 compatible "xen,linux-initrd" "xen,multiboot-module"
fdt set /chosen/module@1 reg <0x42000000 0x11BEB7>
 
booti 0x49000000 - 0x44000000

        启动xen,xen加载dom0:

e9bbdb3baaf34d98b1ca6ed7f3ad02c8.png

        Call Trace (调用栈跟踪)
        这部分信息提供了导致问题发生的函数调用序列。每一行代表一个函数调用,并且包含函数名称以及函数的地址范围。

        可以看到是在device_add发生了异常,设备是来源是qemu的做的设备虚拟化,尝试更换A平台的qemu,也就是qemu-3.1.0,统一IDE环境。


 

        查看当前qemu-system-aarch64的版本信息:

whereis qemu-system-aarch64
qemu-system-aarch64 -version

        当前B平台默认qemu-system-aarch64的版本是6.2.0

 f302087c0a394ac39e9772492c61993e.png

 3a5b4d9bf0f04e9084b1f0eaf715555c.png

 

        切换qemu-system-aarch64-3.1.0的版本,重新输入以下命令,其中qemu-3.1.0/aarch64-softmmu/qemu-system-aarch64这个最好是自己的绝对路径:

qemu-3.1.0/aarch64-softmmu/qemu-system-aarch64 -machine virt,gic_version=3 -machine virtualization=true -cpu cortex-a57 -machine type=virt -m 4096 -smp 4 -bios u-boot.bin -device loader,file=xen,force-raw=on,addr=0x49000000 -device loader,file=Image.gz,addr=0x47000000 -device loader,file=virt-gicv3.dtb,addr=0x44000000 -device loader,file=rootfs.img.gz,addr=0x42000000 -nographic -no-reboot -chardev socket,id=qemu-monitor,host=localhost,port=7777,server,nowait,telnet -mon qemu-monitor,mode=readline

        进入uboot界面,重新启动xen,运动dom0:

        3b5937ca7ba94e71a785b368a1d20729.png

        输入以下命令,记得替换内核镜像文件和根文件系统对应的大小:

fdt addr 0x44000000
fdt resize
 
fdt set /chosen \#address-cells <1>
fdt set /chosen \#size-cells <1>
 
fdt mknod /chosen module@0
fdt set /chosen/module@0 compatible "xen,linux-zimage" "xen,multiboot-module"
fdt set /chosen/module@0 reg <0x47000000 0x7F2E6A>
fdt set /chosen/module@0 bootargs "rw root=/dev/ram rdinit=/sbin/init earlyprintk=serial,ttyAMA0 console=hvc0 earlycon=xenboot"
fdt mknod /chosen module@1
fdt set /chosen/module@1 compatible "xen,linux-initrd" "xen,multiboot-module"
fdt set /chosen/module@1 reg <0x42000000 0x11BEB7>
 
booti 0x49000000 - 0x44000000

        出现命令行之后输入uname,可以看到输出linux,dom0就起来了:

374c29b3893a4242800c8adc98fda67a.png

三、qemu-system-aarch64端口被占用

        每次退出时qemu时,7777的端口被占用:

qemu-system-aarch64: -chardev socket,id=qemu-monitor,host=localhost,port=7777,server,nowait,telnet: Failed to find an available port: Address already in use

       4e918c9fe2354a02b9444aaa279c52f2.png

        一般解决方法,筛选出占用7777的进程口并强制killde:

lsof -i:7777
kill -9 PID

        利用shell脚本相关知识,一步到位:

PORT_QEMU=`lsof -i:7777 | grep qemu | awk '{print$2}'`; echo "$PORT_QEMU";kill -9 $PORT_QEMU

        1. PORT_QEMU=lsof -i:7777 | grep qemu | awk '{print$2}'`
 lsof -i:7777:
        lsof 是一个命令行工具,用于列出当前系统中打开的文件。-i:7777 参数用于筛选出监听端口         7777 的进程。
 | grep qemu:
        grep 用于在 lsof 的输出中搜索包含字符串 qemu 的行。这一步是为了确保我们找到的确实是         qemu 进程。
 | awk '{print$2}':
        awk 是一个强大的文本处理工具。这里使用 {print$2} 来打印每行的第二个字段,通常是进程的PID
        PORT_QEMU=...`:
将上述命令的结果赋值给变量 PORT_QEMU。
        2. echo "$PORT_QEMU"
        echo "$PORT_QEMU":
        输出变量 PORT_QEMU 的内容,通常是一个进程的 PID。
        3. kill -9 $PORT_QEMU
        kill -9 $PORT_QEMU:
        使用 kill 命令发送 SIGKILL 信号(信号 9)来强制终止 PID 为 PORT_QEMU 的进程。

 

标签:kernel,set,aarch64,xen,module,chosen,fdt,qemu
From: https://blog.csdn.net/weixin_48175016/article/details/142216295

相关文章

  • 树莓派操作系统-利用Makefile创建内核镜像文件kernel8.img
    编写树莓派内核映像的过程可以等同于gcc的编译过程:预处理、编译、汇编、链接,后面还会加一步:将可执行文件转换成二进制的镜像文件。在MakeFile里的构建过程分为3步:1.将.c文件经过预处理、编译、汇编生成.o文件,将.S文件经过汇编生成.o文件。2.将.o文件经过链接生成.elf可执行文件......
  • 【运维】aarch64安装JDK17
    1、下载安装包[root@jenkinsapp]#uname-aLinuxjenkins4.18.0-80.7.2.el7.aarch64#1SMPThuSep1216:13:20UTC2019aarch64aarch64aarch64GNU/Linux这里是aarch64架构,所以下载jdk需要下载对应......
  • pbootcms自动加载类文件时发生错误,类名【core\basic\Kernel】
    当PbootCMS在自动加载类文件时发生错误,提示类名 core\basic\Kernel 丢失,通常是由于 Kernel.php 文件被误删除或被安全系统误判为风险文件。在这种情况下,可以按照以下步骤重新上传 Kernel.php 文件来解决问题。解决方案重新下载模板下载任意一个PbootCMS的模板包。......
  • QEMU info
    HowtoconnecttorunningqemuinstancewithqemumonitorPrefertodothisistoconnecttotheQEMU"monitor"viaaUNIXsocket.WhenyoustartQEMU,addthe-monitorparameterasfollows:$qemu-system-x86_64[..otherparams..]-monitorunix......
  • Why system logging "kernel: tcp_parse_options: Illegal window scaling value 15 >
    环境Linux问题在var/log/messages文件中发现以下日志。Oct621:01:05mplttaxsx101kernel:tcp_parse_options:Illegalwindowscalingvalue15>14received.Oct621:01:05mplttaxsx101kernel:tcp_parse_options:Illegalwindowscalingvalue15>14......
  • windwos上通过qemu直接开启img、qcow2等格式磁盘镜像(无需转vmdk)
    qemuQEMU(QuickEMUlator)是一款开源的虚拟化软件,能够模拟多种硬件平台,并支持多种虚拟化技术,如KVM(Kernel-basedVirtualMachine)加速。QEMU能够在多个操作系统上运行,包括Windows、Linux和macOS。下载QEMU:访问QEMU官方网站或通过包管理器下载适用于Windows的QEMU......
  • 《浪人崛起》游戏启动时闪退提示“找不到KernelBase.dll”该怎么解决?浪人崛起游戏崩溃
    启动《浪人崛起》时,游戏闪退并提示“找不到KernelBase.dll”,这着实令人烦恼。别着急,这个问题是可以解决的。可能需要重新安装相关组件,或者检查系统文件完整性。具体该如何操作才能顺利解决呢?本篇将为大家带来《浪人崛起》游戏启动时闪退提示“找不到KernelBase.dll”该怎么解决......
  • 使用nvim查看的linux kernel 源码(可以快速跳转等
    neovim使用的是lazyvim,开箱即用十分方便。linuxkernel源码,如果用clangd构建指定好LLVM还是可以使用下面的指令得到compile_commands.json这个文件的。compile_commands.json就是用来做clangd跳转支持的文件。./scripts/gen_compile_commands.py但是对于aarch64-linux-gnu......
  • 『QEmu』理解QEMU构建系统
    QEmu采用了一套由Kconfig发展而来的Domain-SpecificLanguage(DSL领域特定语言),和meson相结合。其特点是对于模块编译的依赖关系较为严格(QEmu文档自己说的),在大量不同种类的主板之间也可以对同样的模块采用同样的共享代码。对于开发者来说,一方面添加新的设备较为容易;另一方......
  • 2. 修改/编译kernel,luci登录
    1.修改kernel,在 openwrt/imx_openwrt/target/linux/imx/patches-5.15/目录下有一大堆补丁文件,就是用来给目标镜像打补丁的,在这里修改kernel补丁修改设备树补丁文件 0002-add-dts-files.patch+&pcie0{+pinctrl-names="default";+pinctrl-0=<&pinctrl_pcie......