• qemu 内核调试环境搭建


    目录

    【Docker + qemu】

    1. 安装docker

    2. 运行docker

    【unsuccess版 】手动搭建

    1. 下载linux kernel

    2. 安装qemu

    3. 安装交叉工具链

    4. 编译内核

    5. 用qemu启动尝试

    6. 制作根文件系统

    下载、编译和安装busybox

    形成根目录结构

    制作根文件系统镜像

    7. 系统启动运行


    • 所有内容均来自互联网,记录了些自己调试的过程

    【Docker + qemu

    用的大佬的新的博客再续【从零使用qemu模拟器搭建arm运行环境】_海枫的博客-CSDN博客_arm模拟器

    1. 安装docker

    首先,更新现有的包列表:

    sudo apt update

    接下来,使用apt安装一些允许通过HTTPS才能使用的软件包:

    sudo apt install apt-transport-https ca-certificates curl software-properties-common

    然后将官方Docker存储库的GPG密钥添加到您的系统:

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

    将Docker存储库添加到APT源:

    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

    接下来,使用新添加的repo源中的Docker包更新包数据库

    sudo apt update

    确保您要从Docker repo安装而不是默认的Ubuntu repo:

    apt-cache policy docker-ce

    虽然Docker的版本号可能不同,但您还是会看到这样的输出:

    1. docker-ce:
    2. Installed: (none)
    3. Candidate: 18.03.1~ce~3-0~ubuntu
    4. Version table:
    5. 18.03.1~ce~3-0~ubuntu 500
    6. 500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages

    现在docker-ce还没有安装,用上面这个命令我们能看到安装源来自的Docker官方存储库。

    最后,安装Docker:

    sudo apt install docker-ce

    现在应该安装好Docker了,检查它是否正在运行:

    sudo systemctl status docker

    输出应类似于以下内容,表明该服务处于工作状态:

    1. ● docker.service - Docker Application Container Engine
    2. Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
    3. Active: active (running) since Thu 2018-07-05 15:08:39 UTC; 2min 55s ago
    4. Docs: https://docs.docker.com
    5. Main PID: 10096 (dockerd)
    6. Tasks: 16
    7. CGroup: /system.slice/docker.service
    8. ├─10096 /usr/bin/dockerd -H fd://
    9. └─10113 docker-containerd --config /var/run/docker/containerd/containerd.toml

    2. 运行docker

    构建docker 

    1. # cd qemu-arm-linux
    2. # ./build-docker-image.sh
    3. 截至 2022-9-15 在虚拟机由于Dockerfile没有把make -j 改为make -j8导致虚拟机卡死,
    4. 需要把make -j 改为 make -j8

    sudo docker run -it --privileged arm-kernel-3.16-qemu /bin/bash
    /opt/create_image.sh

    /opt/start_qemu.sh

    手动搭建----没成功,用上面的方法就好

    用的版本是ubuntu 18.04 ,qemu是6.0 ,按照下面的步骤做完了,提示-kernerl参数不对,不知怎么解决。

    qemu + Linux 从零使用qemu模拟器搭建arm运行环境_海枫的博客-CSDN博客

    1. 下载linux kernel

    源码官网:The Linux Kernel Archives

    2. 安装qemu

     wget http://wiki.qemu-project.org/download/qemu-6.0.0.tar.bz2

    配置qemu前,需要安装几个软件包:

    sudo apt-get install zlib1g-dev

    sudo apt-get install libglib2.0-0

    sudo apt-get install libglib2.0-dev
     

    配置qemu,支持模拟arm架构下的所有单板:

    ./configure --target-list=arm-softmmu --audio-drv-list=

    编译和安装:

    make

    make install

    3. 安装交叉工具链

    sudo apt-get install gcc-arm-linux-gnueabi

    可根据自己的工具链调整 

    4. 编译内核

    生成vexpress开发板子的config文件:
     
    make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig

    编译:

    make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm -j8

    生成的内核镱像位于arch/arm/boot/zImage, 后续qemu启动时需要使用该镜像
     

    5. 用qemu启动尝试

    • qemu-system-arm -M vexpress-a9 -m 512M -kernel /path/to/kernel/dir/arch/arm/boot/zImage -dtb  /path/to/kernel/dir/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0
    pc123@ubuntu:~/Public/qemu/linux-kernel-5.4.1/linux-5.4.1/arch/arm/boot$ qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/pc123/Public/qemu/linux-kernel-5.4.1/linux-5.4.1/arch/arm/boot/zImage -dtb  /home/pc123/Public/qemu/linux-kernel-5.4.1/linux-5.4.1/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

    红色部分是下载的内核的根目录位置

    这里简单介绍下qemu命令的参数:

    -M vexpress-a9 模拟vexpress-a9单板,你可以使用-M ?参数来获取该qemu版本支持的所有单板

    -m 512M 单板运行物理内存512M

    -kernel /path/to/kernel/dir/arch/arm/boot/zImage  告诉qemu单板运行内核镜像路径

    -nographic 不使用图形化界面,只使用串口

    -append "console=ttyAMA0" 内核启动参数,这里告诉内核vexpress单板运行,串口设备是那个tty。

    • 在上面的测试中,你会发现内核报panic,因为内核找不到根文件系统,无法启init进程。所以接下来需要创建根文件系统

    6. 制作根文件系统

    wget http://www.busybox.net/downloads/busybox-1.20.2.tar.bz2

    make defconfig

    make CROSS_COMPILE=arm-linux-gnueabi-

    make install CROSS_COMPILE=arm-linux-gnueabi-

    安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。

    1.  创建rootfs目录(根目录),根文件系统内的文件全部放到这里
     
    mkdir -p rootfs/{dev,etc/init.d,lib}

    2. 拷贝busybox命令到根目录下

    sudo cp busybox-1.20.2/_install/* -r rootfs/

    3. 从工具链中拷贝运行库到lib目录下

    sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

    4. 创建4个tty端终设备

    sudo mknod rootfs/dev/tty1 c 4 1

    sudo mknod rootfs/dev/tty2 c 4 2

    sudo mknod rootfs/dev/tty3 c 4 3

    sudo mknod rootfs/dev/tty4 c 4 4

    • 制作根文件系统镜像

    1. 生成32M大小的镜像
     dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32

    2. 格式化成ext3文件系统----会生成a9rootfs.ext3文件

    mkfs.ext3 a9rootfs.ext3

    3.  将文件拷贝到镜像中

    sudo mkdir tmpfs

    sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop

    sudo cp -r rootfs/*  ./tmpfs

    sudo umount tmpfs

    7. 系统启动运行

    完成上述所有步骤之后,就可以启动qemu来模拟vexpress开发板了,命令参数如下:
    qemu-system-arm -M vexpress-a9 -m 512M

    -kernel /home/pc123/Public/qemu/linux-kernel-5.4.1/linux-5.4.1/arch/arm/boot/zImage

    -dtb /home/pc123/Public/qemu/linux-kernel-5.4.1/linux-5.4.1/arch/arm/boot/dts/vexpress-v2p-ca9.dtb

    -nographic

    -append "root=/dev/mmcblk0  console=ttyAMA0"

    -sd a9rootfs.ext3

    • pc123@ubuntu:~/Public/qemu/linux-kernel-5.4.1/linux-5.4.1/arch/arm/boot$ qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/pc123/Public/qemu/linux-kernel-5.4.1/linux-5.4.1/arch/arm/boot/zImage -dtb /home/pc123/Public/qemu/linux-kernel-5.4.1/linux-5.4.1/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 console=ttyAMA0" -sd a9rootfs.ext3
    • 报错

    运行QEMU时,出现错误:(process:8559): GLib-WARNING...gmem.c:483: custom memory allocation vtable not support_宅学部落-王利涛的博客-CSDN博客_qemu运行结束或配置出错

  • 相关阅读:
    【微服务架构组件之配置中心一】Nacos
    项目经理如何提高团队的开发效率?
    编程每日一练(多语言实现)基础篇:控制台打印九九乘法口诀表
    终于有清华大佬把“:JVM入门以及Class格式”给大家讲解透彻了
    关于数据类型的取值范围
    websocket(三)——前端JS封装
    中断机制-通过interrupt实现线程中断停止
    数据处理软件介绍(PIX4D和MAOIHPHO)
    web安全(初识)
    现代C++编程实践(八)—关于noexcept修饰符和noexcept操作符
  • 原文地址:https://blog.csdn.net/m0_37844072/article/details/126615410