0
点赞
收藏
分享

微信扫一扫

从0开始搭建qemu调试环境

1 虚拟机安装(以在win10下安装vmware station 16.0 Pro为例)

(1)点击vmware station 16.0 pro安装包,按默认方式安装该安装包
(2)点击帮助->输入许可证密钥选项,并输入激活密钥
(3)若出现以下提示:您无权输入许可证密钥。请使用系统管理员账户重新尝试。
则按以下方式激活:
    a 按win + R键,并输入cmd打开命令行窗口
    b 在命令行窗口输入以下命令切换工作目录
      cd C:\Program Files (x86)\VMware\VMware Workstation\x64
    c 输入如下命令激活vmware,其中xxx为激活码
      vmware-vmx.exe --new-sn xxx
(4)若出现以下提示:与 vmx86 驱动程序的版本不匹配: 预期为 385.0,实际为 331.0错误。
    则进入C:\Windows\System32\drivers目录,将vmx86.sys修改vmx86.zzz,即将其后缀名修改为系统无法识别的类型,然后重启系统后再删除该文件

2 Ubuntu18.04安装

(1)打开vmstation ->创建新的虚拟机 -> 指定os镜像文件,一路next安装操作系统,如ubuntu18.04
(2)设置ubuntu的root密码
    sudo passwd
    然后输入密码,该密码即为root密码
(3)ubuntu18.04更换国内源
    a 备份/etc/apt/sources.list文件
      sudo mv /etc/apt/sources.list/etc/apt/sourses.list.backup
    b 新建/etc/apt/sources.list文件
      sudo vi /etc/apt/sources.list
    c 输入以下内容(阿里源)
      deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
      deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
      deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
(4)若主机ping不通虚拟机,且主机不显示vmnet8网络适配器。则可能是前一次的虚拟机卸载后,注册表未清理干净导致。可用如下方法清理注册表
    a 打开CCleaner官网,根据提示安装CCleaner清理软件
在这里插入图片描述
    b 安装完成后,双击打开CCleaner软件,找到Registry选项
在这里插入图片描述
    c 点击Scan for Issues,会出现以下problem和data信息
在这里插入图片描述
    d 点击右下角的Fix selected Issues按照提示步骤清空问题信息
在这里插入图片描述
    e 重新启动虚拟机,点击编辑 -> 虚拟网络编辑器,勾选将主机虚拟适配器连接到此网络选项
在这里插入图片描述
(5)安装vim
    sudo apt-get install vim
(6)设置虚拟机静态ip
    a&ensp在/etc/netplan目录下打开01-network-manager-all.yaml文件。注意:该文件名不一定与上面一样,需根据实际情况配置
    b 在该文件中设置如下内容
     # Let NetworkManager manage all      devices on this system
     network:
     version: 2
     renderer: NetworkManager
     ethernets:
     ens33:
     dhcp4: no
     addresses: [192.168.136.135/24]
     gateway4: 192.168.136.2
     nameservers:
     addresses: [192.168.1.1]
     其中:网卡名称,ip地址等需根据实际情况配置
     网关地址可查看虚拟机的 编辑 --> 虚拟网络编辑器 --> nat设置 获取
     dns地址查看 windows cmd -->ipconfig /all --> 默认网关
    c yaml语法格式
     使用缩进作为不同层次区分,且缩进只能用空格,不能用tab键。
     缩进的空格数目没有限制,但同层次的缩进空格数必须相同后面需要加空格
    d 使配置生效
      netplan apply
(7)安装sshd
    a sudo apt-get update
    b sudo apt-get install openssh-server
    c 启动ssh服务
      sudo /etc/init.d/ssh start 或
      sudo systemctl start ssh
    d 重启ssh服务
      sudo /etc/init.d/ssh restart 或
      sudo systemctl stop ssh
    e 关闭ssh服务
      sudo /etc/init.d/ssh stop
    f 设置ssh服务为自启动
      sudo systemctl enable ssh
    g 查看ssh的启动状态
      sudo systemctl status ssh
(8)安装samba
    a 安装samba服务器
      sudo apt-get install samba samba-common
    b 创建一个samba分享的目录
      mkdir /home/lgj/work
    c 设置目录权限
      sudo chmod 777 /home/lgj/work
    d 添加samba用户
      sudo smbpasswd -a lgj
      然后设置samba密码。其中lgj为我的用户名
    e 配置samba配置文件
      sudo vim /etc/samba/smb.conf
      添加如下内容
      [share]
      comment = share folder
      browseable = yes
      path = /home/lgj/work
      create mask = 0700
      directory mask = 0700
      valid users = lgj
      force user = lgj
      force group = lgj
      public = yes
      available = yes
      writable = yes
    f 重启samba服务器
      sudo service smbd restart
    g 在windows下映射网络驱动器
      输入:\192.168.136.135\share
      输入用户名和密码,samba挂载成功
    h 开启ufw以后,samba挂载不上问题解决(允许samba端口访问)
      sudo ufw allow 137
      sudo ufw allow 138
      sudo ufw allow 139
      sudo ufw allow 389
      sudo ufw allow 445
      sudo ufw allow 901

3 开发工具安装

(1)make安装
    sudo apt-get install make
(2)gcc安装
    sudo apt-get install gcc
    sudo apt-get install g++
(3)aarch64交叉工具链安装
    a 下载
      wget https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
    b 解压
      xz -d gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
      tar xvf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar
(4)编译内核时缺少库问题解决
    a /bin/sh: 1: flex: not found问题
      sudo apt-get install flex
    b /bin/sh: 1: bison: not found
      sudo apt-get install bison
    c fatal error: openssl/bio.h: No such file or directory
      sudo apt-get install libssl-dev
    d <stdin>:1:10: fatal error: libelf.h: No such file or directory
      sudo apt-get install libelf-dev

4 Jenkins安装

(1)sudo update
(2)安装jdk-8
      sudo apt install openjdk-8-jdk
(3)下载jenkins公钥
      wget https://pkg.jenkins.io/debian/jenkins.io.key
(4)使用apt-key将公钥添加到系统密钥中
      sudo apt-key add jenkins.io.key
(5)将jenkins存储库添加到来源列表中
      打开/etc/apt/sources.list文件,将下列内容添加到末尾:
      deb https://pkg.jenkins.io/debian-stable binary/
(6)安装jenkins
      sudo apt update
      sudo apt install jenkins
(7)如果jenkins被正确安装,则会自动启动,可通过下列命令验证其是否已启动
      sudo systemctl status jenkins
(8)默认情况下,jenkins仅允许本地访问服务器,因此需配置ufw防火墙以允许传入连接到jenkins服务器的端口。jenkins默认在8080端口工作,必须要允许ufw防火墙访问此端口
      sudo ufw allow 8080
(9)检查ufw是否允许8080端口传入流量
      sudo ufw status
(10)通过http访问jenkins(端口转发)
    a nat方式需要设置端口转发
      在虚拟机–>编辑–>虚拟网络编辑器–> nat设置中添加端口转发在这里插入图片描述
    b 其中192.168.136.135为虚拟机ip,8080为jenkins端口,9080为主机端口。
    c 访问jenkins,其中192.168.1.4为主机ip
      https://192.168.1.4:9080
(11)如果防火墙处理关闭状态。可用下列命令开启
      sudo ufw allow OpenSSH
      sudo ufw enable
(12)获取并输入jenkins密码
      sudo cat /var/lib/jenkins/secrets/initialAdminPassword
      da10519418c2446ba1dfb89b1152c450
(13)安装插件
(14)创建管理员账户
      设置用户名和密码

5 代码下载及编译

5.1 ATF代码

(1)下载atf
    git clone https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
(2)编译atf
    cd trusted-firmware-a
    export ARCH=arm64
    export CROSS_COMPILE=xxx/bin/aarch64-linux-gnu-
    make PLAT=qemu BL33=yyy/u-boot/u-boot.bin all fip DEBUG=1
    以上编译方式将编译可在qemu平台运行的atf镜像,并且在启动过程中会加载yyy/u-boot/u-boot.bin作为uboot镜像。
(3)由于atf的qemu配置中默认使用GICv2,若要配置系统使用GICv3,则需修改plat/qemu/qemu/platform.mk中的如下行:
    QEMU_USE_GIC_DRIVER := QEMU_GICV2 修改为:
    QEMU_USE_GIC_DRIVER := QEMU_GICV3

5.2 Uboot代码

(1)下载uboot
    git clone https://source.denx.de/u-boot/u-boot.git
(2)编译uboot
    export ARCH=arm64
    export CROSS_COMPILE=xxx/bin/aarch64-linux-gnu-
    make qemu_arm64_defconfig
    make
    以上编译方式将编译可在qemu平台运行的atf镜像
(3)若uboot需用semihosting方式加载内核和dtb,则在configs/qemu_arm64_defconfig中添加以下配置:
    CONFIG_SEMIHOSTING=y

5.3 kernel代码

(1)下载kernel
    a 进入内核官网
      https://www.kernel.org/
    b 选择一个希望下载的分支,点击browse,然后点击summary
    c 拉到底,复制git地址xxx
    d 下载代码
      git clone xxx
(2)编译内核
    export ARCH=arm64
    export CROSS_COMPILE=xxx/bin/aarch64-linux-gnu-
    make defconfig
    make
    以上编译方式编译的内核可在qemu环境下运行

5.4 rootfs代码

(1)我们选择buildroot来编译我们的rootfs
(2)buildroot下载
    从以下地址下载buildroot并解压
    https://buildroot.org/download.html
    tar zxvf buildroot-2021.05.1.tar.gz
    或者采用git下载
    git clone git://git.buildroot.net/buildroot
(3)buildroot配置
    a 若出现Unable to find the ncurses libraries or the …问题,则安装以下lib
      sudo apt-get install libncurses5-dev libncursesw5-dev
(4)buildroot具体配置方式可参考以下链接
    buildroot使用详解

5.5 qemu代码

(1)源码下载
    git clone https://gitlab.com/qemu-project/qemu.git
    cd qemu
    git submodule init
    git submodule update --recursive
(2)相关库安装
    sudo apt-get install libcap-dev (–enable-virtfs需要)
(3)编译错误解决
    a ERROR: Cannot find Ninja 错误解决
      sudo apt-get install re2c
      git clone https://github.com/ninja-build/ninja.git
      ./configure.py --bootstrap
      sudo cp ./ninja /usr/bin/
    b ERROR: meson setup failed问题解决
       sudo apt-get install python3
       python3-pip ninja-build
       切换到python3
       sudo rm /usr/bin/python3
       sudo ln -s /usr/bin/python3.6 /usr/bin/python3
       安装meson
       pip3 install --user meson
    c RROR: Problem encountered: virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel 问题解决
      从以下网站下载libcap-ng包:
      https://launchpad.net/ubuntu/+source/libcap-ng/0.7.7-3.1
      cd libcap-ng-0.7.7
      ./autogen.sh
      ./configure
      make
      sudo make install
(4)编译qemu
      ./configure --target-list= aarch64-linux-user, aarch64-softmmu --enable-virtfs --enable-debug
      make
      sudo make install

6 qemu运行

6.1 qemu运行kernel示例

(1)主机安装brctl和tunctl工具
    sudo apt install uml-utilities
    sudo apt install bridge-utils
(2)主机通过桥接方式配置tap接口,该接口可用于虚拟机与主机之间的网络通信
    brctl addbr br0
    ip addr flush dev ens33
    brctl addif br0 ens33
    tunctl -t tap0 -u whoami
    brctl addif br0 tap0
    ifconfig ens33 up
    ifconfig tap0 up
    ifconfig br0 up
    ifconfig ens33 192.168.136.135
    ifconfig br0 192.168.136.110
    ifconfig tap0 192.168.136.115
    其中ip地址需要根据实际情况配置。
    虚拟机启动后可在模拟目标板上使用以下命令配置ip:
    sudo ifconfig eth0 192.168.136.226
(2)启动qemu
    cur_time=$(date +%Y-%m-%d-%H-%M-%S)

    qemu-system-aarch64
      -M virt,gic_version=3
      -cpu cortex-a53
      -smp 2
      -m 2048M
      -kernel xxx/kernel/arch/arm64/boot/Image
      -drive file=xxx/buildroot/output/images/rootfs.ext4,if=none,id=blk1,format=raw
      -device virtio-blk-device,drive=blk1
      -append "console=ttyAMA0 root=/dev/vda"
      -netdev tap,id=net0,ifname=tap0,script=no,downscript=no
      -device virtio-net-device,netdev=net0
      -fsdev local,security_model=mapped-xattr,path=zzz/share,id=fsdev0
      -device virtio-9p-device,fsdev=fsdev0,mount_tag=virtshare
      -dtb xxx/kernel/arch/arm64/boot/dts/qemu/test-board.dtb
      -nographic -d guest_errors,unimp -D log/$cur_time \

    其中:
    a -d guest_errors,unimp -D log/$cur_time用于将qemu的log导出到文件log/$cur_time中。
    b -dtb用于指定内核启动时使用的dtb,该参数可以不指定,此时qemu将会使用指定machine默认创建的dtb。
    c -fsdev用于虚拟机与host之间共享目录,即主机上的zzz/share目录可以与虚拟机共享,虚拟机启动后通过以下mount命令挂载该目录即可:
      mount -t 9p -o trans=virtio /mnt/host virtshare
      其中挂载点可以通过以下sysfs路径查看:
      /sys/bus/virtio/drivers/9pnet_virtio/virtio&lt;n&gt;/mount_tag

6.2 qem启动uboot示例

    qemu-system-aarch64
      -M virt
      -cpu cortex-a53
      -smp 2
      -m 2048M
      -kernel /home/lgj/work/u-boot/u-boot
      -nographic

6.3 qemu通过atf启动kernel示例

(1)按第五章的方式分别编译atf、uboot和kernel
(2)按以下命令启动qemu
    cur_time=$(date +%Y-%m-%d-%H-%M-%S)
    qemu-system-aarch64 -nographic -machine virt,secure=on,gic_version=3
      -cpu cortex-a53
      -smp 2 -m 2048
      -d guest_errors,unimp -D log/$cur_time
      -bios xxx/trusted-firmware-a/build/qemu/debug/bl1.bin
      -drive file=yyy/buildroot/output/images/rootfs.ext4,if=none,id=blk1,format=raw
      -device virtio-blk-device,drive=blk1
      -semihosting-config enable=on,target=native
    该命令执行后,qemu会从atf的bl1.bin开始执行,并依次启动其后的bl2、bl31和uboot
(3)由于uboot添加了对semihosting的支持,因此在uboot命令行中执行以下命令,通过semihosting方式从host上加载kernel和dtb
    smhload xxx/kernel/arch/arm64/boot/Image 0x40000000
    smhload xxx/kernel/arch/arm64/boot/dts/qemu/test-board-smc.dtb 0x43000000
(4)设置bootargs并启动内核
    setenv bootargs " console=ttyAMA0 root=/dev/vda"
    booti 0x40000000 - 0x43000000

6.4 退出qemu

    先按住Ctrl + A,松开后再输入X

7 qemu通过gdb调试目标镜像

(1)在启动qemu时添加-s –S选项,如:
    qemu-system-aarch64 -nographic -machine virt,secure=on,gic_version=3
      -cpu cortex-a53
      -smp 2 -m 2048
      -d guest_errors,unimp -D log/$cur_time
      -bios xxx/trusted-firmware-a/build/qemu/debug/bl1.bin
      -drive file=yyy/buildroot/output/images/rootfs.ext4,if=none,id=blk1,format=raw
      -device virtio-blk-device,drive=blk1
      -semihosting-config enable=on,target=native
    其中:
    -S:表示QEMU虚拟机会冻结CPU,直到远程的GDB输入相应控制命令
    -s:表示在1234端口接受GDB的调试连接,其与-gdb tcp::1234参数相同
(2)在另一窗口下通过dgb从atf的bl1开始启动
    xxx/bin/aarch64-linux-gnu-gdb yyy/trusted-firmware-a/build/qemu/debug/bl1/bl1.elf
(3)添加uboot和kernel的符号表
    add-symbol-file /home/lgj/work/u-boot/u-boot
    add-symbol-file /home/lgj/work/linux/vmlinux
    若需要调试bl2和bl31,其符号表添加方式类似
(4)gdb通过tcp方式attach到qemu的目标板上
    target remote localhost:1234
(5)设置断点
(6)开始代码执行
    c
(7)若未设置断点,系统将会进入uboot命令行,此时可采用6.3的方式启动内核

8 qemu monitor的使用

    qemu monitor是一个qemu控制台,我们可以通过它实现与qemu或正在运行虚拟机之间的交互。在qemu monitor中我们可以实现很多功能,如查询虚拟机的状态信息,添加删除设备,更改虚拟机的运行时配置等。
(1)进入qemu monitor
    先按住Ctrl + A,松开后再输入C
(2)退出qemu monitor
    与进入时相同,也是先按住Ctrl + A,松开后再输入C
(3)help命令
    其作用是用于显示qemu monitor支持的命令及其相应的用法
    示例1:显示其支持的所有命令
在这里插入图片描述
    示例2:显示特定命令的用法
在这里插入图片描述
(4)info命令
    该命令用于显示虚拟机的状态
    示例1:显示目标系统的cpu
在这里插入图片描述
    示例2:显示所有cpu的寄存器值
在这里插入图片描述
(5)其它命令可参考帮助信息

举报

相关推荐

0 条评论