QEMU模拟ATF启动

这篇具有很好参考价值的文章主要介绍了QEMU模拟ATF启动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

QEMU模拟ATF启动

通过qemu模拟ATF的启动,即启动流程为:

其中bl33为uboot。

Qemu

  1. apt方式下载

    # 不推荐以apt-get方式安装,版本较低
    # 后续启动kernel可能失败
    sudo apt-get install qemu
    # 查看ARM64平台版本
    qemu-system-aarch64 --version
    
  2. 源码安装

    去官网下载最新的版本,这里下载qemu-7.1.0,并解压

    # 下载
    wget https://download.qemu.org/qemu-7.1.0.tar.xz
    # 解压
    xz -d qemu-7.1.0.tar.xz
    tar xvf qemu-7.1.0.tar
    
  3. 相关库安装

    sudo apt-get install libcap-dev
    sudo apt-get install pkg-config
    sudo apt-get install zlib1g-dev libglib2.0-dev
    sudo apt-get install libpixman-1-dev
    sudo apt install python3-pip
    pip3 install --user meson
    
    # ninja
    sudo apt-get install re2c
    git clone https://github.com/ninja-build/ninja.git
    cd ninja && ./configure.py --bootstrap  
    sudo cp ./ninja /usr/bin/
    ninja --version
    
  4. 问题解决

    • virtio-9p (virtfs) on Linux requires libcap-ng-devel and libattr-devel

      wget https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/libcap-ng/0.7.7-3.1/libcap-ng_0.7.7.orig.tar.gz
      cd libcap-ng-0.7.7
      ./autogen.sh
      ./configure
      make
      sudo make install
      
  5. 编译安装

    ./configure --target-list=x86_64-softmmu,x86_64-linux-user,arm-softmmu,arm-linux-user,aarch64-softmmu,aarch64-linux-user --enable-kvm
    make -j16
    sudo make install
    # 查看版本
    qemu-system-aarch64 --version
    

U-boot

  1. 下载uboot

    git clone https://source.denx.de/u-boot/u-boot.git
    
  2. 编译uboot

    export ARCH=arm64
    export CROSS_COMPILE=aarch64-linux-gnu- 
    make qemu_arm64_defconfig
    make -j16
    
  3. uboot位置

    ./u-boot.bin
    

Kernel

  1. 下载kernel

    进入官网,下载稳定版本的,这里下载linux-5.19.6.tar.xz,并解压

    # 下载
    https://www.kernel.org/
    # 解压
    xz -d linux-5.19.6.tar.xz
    tar xvf linux-5.19.6.tar
    
  2. 编译kernel

    export ARCH=arm64
    export CROSS_COMPILE=aarch64-linux-gnu-
    make defconfig
    make -j16
    
  3. Image位置

    ./arch/arm64/boot/Image
    

Rootfs

  1. 下载buildroot

    进入官网,下载稳定版本,这里下载buildroot-2022.05.2.tar.xz,并解压

    # 下载
    https://buildroot.org/download.html
    # 解压
    xz -d xz -d buildroot-2022.05.2.tar.xz
    tar xvf buildroot-2022.05.2.tar
    
  2. 配置

    make ARCH=arm64 menuconfig
    

    如出现Unable to find the ncurses libraries or the required header files,需要安装以下库

    sudo apt-get install libncurses5-dev libncursesw5-dev
    
    • Target Options

      Target Architecture:AArch64(little endian)

      Target Architecture Variant:cortex-A53

      其他默认不变。

    • Toolchain

      这里让buildroot自己去下载适配的工具链

    • System configuration

      这里默认不变

    • Filesystem images

      ext2/3/4 root filesystem:y

      • ex2/3/4 variant:ext4
  3. 编译

    注意不能-j进行多核编译

    sudo make
    

ATF

  1. 下载ATF

    git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
    
  2. 编译

    export ARCH=arm64
    export CROSS_COMPILE=aarch64-linux-gnu-
    make PLAT=qemu all DEBUG=1
    

    TIPS:默认调试版本日志等级为40(INFO),发布版本中为20(NOTICE),可加LOG_LEVEL=50参数开启VERBOSE日志。

  3. bin文件位置

    build/qemu/debug
    

    生成bl1.bin,bl2.bin,bl31.bin等文件

启动

新建qemu_test文件夹,并进入。

  1. qemu启动u-boot

    qemu-system-aarch64 \
         -M  virt \
         -cpu cortex-a53 \
         -smp 2 \
         -m 2048M \
         -kernel ../u-boot-master/u-boot \
         -nographic
    

    TIPS:

    解决qemu启动输出参数较多,添加启动选项保存到配置文件中,如下

    -writeconfig qemu-test.conf
    

    下次启动时,直接加载该配置文件即可

    qemu-system-aarch64 –readconfig qemu-test.conf
    

    退出qemu,按住Ctrl+A,松开后再输入X即可。

  2. qemu启动kernel

    qemu-system-aarch64 \
         -M virt \
         -cpu cortex-a53 \
         -smp 2 \
         -m 2048M \
         -kernel ../linux-5.19.6/arch/arm64/boot/Image \
         -append "console=ttyAMA0 root=/dev/vda" \
         -nographic
    

    这里由于缺少根文件系统rootfs,会打印end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

  3. qemu启动rootfs(kernel)

    qemu-system-aarch64 \
         -M virt \
         -cpu cortex-a53 \
         -smp 2 \
         -m 2048M \
         -kernel ../linux-5.19.6/arch/arm64/boot/Image \
         -drive file=../buildroot-2022.05.2/output/images/rootfs.ext4,if=none,id=blk1,format=raw \
         -device virtio-blk-device,drive=blk1 \
         -append "console=ttyAMA0 root=/dev/vda" \
         -nographic
    

    使用root的password登陆进去。

  4. qemu通过u-boot启动kernel

    uboot下载kernel镜像和设备数dtb有两种方式:

    • 可以配置uboot的网络,使用tftp方式下载
    • 使用半主机semihosting的方式加载

    我们这里使用后者,但是需要编译uboot时,在configs/qemu_arm64_defconfig中添加以下配置CONFIG_SEMIHOSTING=y。重新编译后,运行:

    qemu-system-aarch64 \
         -M  virt \
         -cpu cortex-a53 \
         -smp 2 \
         -m 2048M \
         -kernel ../u-boot-master/u-boot \
         -semihosting-config enable=on,target=native \
         -nographic
    

    然后通过semihosting方式添加kernel

    smhload ../linux-5.19.6/arch/arm64/boot/Image
    

    最后设置bootargs并启动内核

    setenv bootargs " console=ttyAMA0 root=/dev/vda"
    booti 0x40000000 - 0x43000000
    

    TODO:这里没有添加成功smhload命令

  5. qemu通过ATF启动u-boot

    拷贝bl1.bin、bl2.bin、bl31.bin到当前目录下,拷贝u-boot.bin到当前目录下并重命名为bl33.bin

    cp ../arm-trusted-firmware-2.7.0/build/qemu/debug/*.bin ./
    cp ../u-boot-master/u-boot.bin ./bl33.bin
    
    qemu-system-aarch64 \
        -nographic -machine virt,secure=on \
        -cpu cortex-a53 \
        -smp 2 -m 2048 \
        -d unimp \
        -bios bl1.bin \
        -semihosting-config enable=on,target=native
    

    注意:qemu默认使用FIP方式加载,原始镜像存在memmap中,如果memmap没有镜像,会打印Firmware Image Package header check failed.FIP校验头失败。然后就会使用半主机的方式读取镜像Using Semi-hosting IO,直接半主机方式读取原始镜像到内存地址中(实际上是通过读文件的方式),即不会在校验FIP方式的头这些,因此如果需要FIP方式加载,需要将镜像事先加载到memmap中。

    可以使用gdb的restore命令用来将文件中的数据加载到内容中,使用方法如下,详见第5点

    restore file binary start_addr end_addr
    
  6. qemu通过gdb调试目标镜像

    在启动qemu时添加-s –S选项。

    -S:表示QEMU虚拟机会冻结CPU,直到远程的GDB输入相应控制命令
      -s:表示在1234端口接受GDB的调试连接,其与-gdb tcp::1234参数相同

    qemu-system-aarch64 \
        -nographic -machine virt,secure=on \
        -cpu cortex-a53 \
        -smp 2 -m 2048 \
        -d unimp \
        -bios bl1.bin \
        -semihosting-config enable=on,target=native -s -S
    

    启动GDB,apt-get安装的交叉工具链没有gdb(可以安装gdb-multiarch的gdb),我们这里使用自己下载的工具链。在另一窗口下通过gdb从atf的bl1开始启动:

    ~/toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gdb ../arm-trusted-firmware-2.7.0/build/qemu/debug/bl1/bl1.elf
    

    gdb通过tcp方式attach到qemu的目标板上

    target remote localhost:1234
    

    就开始调试了,执行N,C,B等gdb命令。

    TIPS1:默认ATF编译时开优化,需要打开调试

    CFLAGS='-O0 -gdwarf-2'
    make PLAT=qemu all DEBUG=1
    

    TIPS2:默认我们开始使用的是bl1的符号表,因此如果要调试bl2,bl31,kernel等,需要在gdb中添加对应的符号表,如下:

    add-symbol-file ../arm-trusted-firmware-2.7.0/build/qemu/debug/bl2/bl2.elf
    
  7. qemu使用FIP方式加载ATF

    编译生成FIP包,需要指定BL33镜像的位置,默认会生成fip.bin

    export ARCH=arm64
    export CROSS_COMPILE=aarch64-linux-gnu-
    make PLAT=qemu BL33=../u-boot-master/u-boot.bin all fip DEBUG=1 LOG_LEVEL=50 
    

    下面的命令在build/qemu/debug目录下执行。

    启动qemu

    qemu-system-aarch64 \
        -nographic -machine virt,secure=on \
        -cpu cortex-a53 \
        -smp 2 -m 2048 \
        -d unimp \
        -bios bl1.bin \
        -semihosting-config enable=on,target=native -s -S
    

    启动gdb调试

    ~/toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gdb bl1/bl1.elf
    
    • 连接目标板

      target remote localhost:1234
      
    • 加载fip.bin到内存

      restore fip.bin binary 0x00040000
      

      这里的开始地址和最大大小就是qemu平台配置的

      #define PLAT_QEMU_FIP_BASE		0x00040000
      #define PLAT_QEMU_FIP_MAX_SIZE		0x00400000
      
    • 全速运行

      c
      

    如果开启VERBOSE打印,可以看到每个镜像加载时会打印如下内容文章来源地址https://www.toymoban.com/news/detail-447287.html

    VERBOSE: FIP header looks OK.
    VERBOSE: Using FIP
    

参考

  1. 利用Qemu-4.0虚拟ARM64实验平台
  2. 从零开始搭建qemu调试环境

到了这里,关于QEMU模拟ATF启动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Openwrt]一步一步搭建MT7981A uboot、atf、openwrt-21.02开发环境操作说明

    软件安装包 ubuntu-18.04-desktop-amd64.iso  sudo passwd [sudo] password for w1804:  Enter new UNIX password:  Retype new UNIX password:  passwd: password updated successfully sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 将以下内容添加到sources.list文件

    2024年02月12日
    浏览(99)
  • 4.网络游戏逆向分析与漏洞攻防-游戏启动流程漏洞-模拟游戏登陆器启动游戏并且完成注入

    内容参考于: 易道云信息技术研究院VIP课 上一个内容:游戏启动流程的分析  码云地址(master 分支):https://gitee.com/dye_your_fingers/titan 码云版本号:bcf7559184863febdcad819e48aaacad9f25d633 代码下载地址,在 titan 目录下,文件名为:titan-模拟游戏登陆器启动游戏并且完成注入.zip 链接

    2024年02月22日
    浏览(34)
  • uboot 启动内核代码分析

    uboot的本质就是一个复杂点的裸机程序。内核本身也是一个\\\"裸机程序“,和uboot、和其他裸机程序并没有本质区别。 区别就是操作系统运行起来后在软件上分为内核层和应用层,分层后两层的权限不同,在内存访问和设备操作的管理上更加精细(内核可以随便访问各种硬件,

    2024年02月11日
    浏览(36)
  • ATF bl1 ufshc_dme_get/set处理流程分析

    以海思hikey960为例来介绍,简单介绍在ATF BL1阶段的初始化处理。 UTP:UFS Transport Protocol DME:Device Management Entity UCS:UFS Command Set UIC:UFS Interconnect UTRD:UTP Transfer Request Descriptor UPIU:UFS Protocol Information Unit https://github.com/ARM-software/arm-trusted-firmware 可以通过下面的命令来下载ATF的代

    2024年02月12日
    浏览(18)
  • ARM的安全启动—ATF/TF-A以及它与UEFI的互动

    ARMV8需要掌握4个特权等级(EL0-EL3)、4个安全状态(secure non-secure root realm)、2个执行状态(arch32/arch64)。思考问题: Aarch32和Aarch64两个之间如何切换跳转 4个安全态如何跳转 4个特权等级如何跳转 开机不同启动阶段对应不同代码如何进行过渡和切换 armv8/armv9不同特权程序之间的跳

    2024年02月03日
    浏览(29)
  • uboot启动Linux内核卡住

    uboot启动Linux内核uImage卡在Starting kernel ...这一步 由于出现这种情况的原因有很多,暂时列举几种 查看uImage的信息 可以看见加载地址与入口地址为0xc2000040。由于uImage在头部添加了64个字节的识别信息,那么 加载地址是uboot在加载内核时的存放地址,入口地址是内核代码的开始

    2024年02月13日
    浏览(32)
  • ARM uboot 启动 Linux 内核

    此处,我使用的是九鼎提供的 uboot : 进入 uboot 的 sd_fusing 目录,执行命令烧写 uboot : ./sd_fusing.sh /dev/sdb 。 按任意键,进入 uboot 命令行: 将 Linux kernel 拷贝到 30008000。

    2024年02月11日
    浏览(37)
  • QEMU tap数据接收流程

    QEMU tap数据接收步骤: qemu从tun取数据包 qemu将数据包放入virtio硬件网卡。 qemu触发中断。 虚拟机收到中断,从virtio读取数据。 在qemu中步骤1(tap_read_packet)和步骤2(qemu_send_packet_async)都是在tap_send中完成的,其中步骤2是异步流程。 qemu通过qemu_net_queue_deliver将数据包发送到v

    2024年02月11日
    浏览(28)
  • pynq-1 viaodo配置和启动uboot

    Pynq-Z1 u-boot 移植笔记 Author: (2022.10.21) 创建vivado,生成bistream,因为前期不清楚芯片pynq-z1如何配置时钟和ddr部分,可以网上下载board file,然后在vivado安装目录下,新建board_file目录,将pynq-z1 board file放在此目录,就可以在vivado的board部分看到pynq-z1板卡,直接选中,然后新建

    2024年02月14日
    浏览(28)
  • QEMU源码全解析 —— PCI设备模拟(6)

    接前一篇文章: 上一回讲到了pci_edu_realize函数中的pci_register_bar函数,本回对于其进行详细解析。 再次贴出pci_register_bar函数源码,在hw/pci/pci.c中,代码如下: (1)首先根据region_num找到PCIDevice-io_regions数组中对应的项。PCI设备的MMIO存放在PCIIORegion结构体中,结构体中保存了

    2024年01月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包