首页 > 其他分享 >qemu搭建riscv的可调试环境

qemu搭建riscv的可调试环境

时间:2023-10-07 09:55:35浏览次数:45  
标签:kernel ext4 riscv make qemu 调试

qemu搭建riscv的可调试环境

  • riscv工具链

(网上大多数用Github直连的工具链,但是因为太大,download的时候老是出问题)

选择使用Cross-compilation toolchains for Linux - Home (bootlin.com)进行下载,之后解压。

bin目录下为可执行的工具链,将其添加到PATH中。

  • qemu

qemu压缩包下载:QEMU,之后解压。

默认的安装命令:

这样会生成qemu支持的所有体系架构的可执行文件。

如果需要只生成一种架构的,需要配置target-list选项。

make之后在build目录下有对应qemu可执行文件:

将其添加到PATH中。

  • opensbi

(opensbi用于系统启动代码跳转)

项目github地址:https://github.com/riscv-software-src/opensbi

make时指定交叉编译器CROSS_COMPILE=riscv64-linux。

同时,指定PLATFORM=generic。

想要模拟不同类型的设备,make该项目时的PLATFORM参数可以参考opensbi/docs/platform下的md文件。

make之后,在opensbi/build/platform/generic/firmware下生成如下文件:

主要有三种类型的firmware:dynamic、jump、payload。

这里主要使用jump类型的fw_jump.elf文件,启动时直接跳转到OS入口代码。

  • linux kernel

直接github上下载linus的分支:torvalds/linux: Linux kernel source tree (github.com)

然后切换到指定版本的tag。

make ARCH=riscv CROSS_COMPILE=riscv64-linux- defconfig,之后make ARCH=riscv CROSS_COMPILE=riscv64-linux- menuconfig。

要使用GDB+qemu调试内核的话,一般得选中kernel debug以及取消地址随机化KASLR(不过在riscv相关的配置中没有发现这个配置)。

看riscv社区的新闻:Linux 内核地址空间布局随机化 “KASLR” for RISC-V – RISC-V INTERNATIONAL (riscv.org),riscv至今没有添加该特性。

make之后,会在arch/riscv/boot下生成对应的Image镜像。

  • rootfs

(创建根文件系统)地址:Buildroot - Making Embedded Linux Easy

make menuconfig选择RISCV

之后sudo make,会在output/images下生成对应的文件:

  • 共享文件

qemu中运行的虚拟机往往需要和主机间传输数据,因此,最常使用的方式就是共享文件。

dd if=/dev/zero of=ext4.img bs=512 count=131072

mkfs.ext4 ext4.img

sudo mount -t ext4 -o loop ext4.img ./share

在当前目录下生成share目录,可用于虚拟机和主机间共享数据:

  • gdb调试
#!/bin/bash

qemu-system-riscv64 -M virt \
	-bios fw_jump.elf \
	-kernel Image \
	-append "rootwait root=/dev/vda ro" \
	-drive file=rootfs.ext2, format=raw,id=hd0 \
	-device virtio-blk-device, device=hd0 \
	-drive file=ext4.img, format=raw,id=hd1 \
	-device virtio-blk-device, driver=hd1 \
	-s -nographic

-s参数使主机端使用端口1234进行kernel调试。

运行命令后:

主机端调试,使用riscv64-linux-gdb调试编译kernel后生成的vmlinux。

target remote localhost:1234用于调试虚拟机。

以调度的关键函数finish_task_switch为断点为例:

此时挂载到从init_task切换到下一个进程的过程中了。

常规的gdb命令可以用于调试kernel,查看kernel运行时信息。

标签:kernel,ext4,riscv,make,qemu,调试
From: https://www.cnblogs.com/codetrap/p/17745593.html

相关文章

  • vscode单步调试Android c++源码
    vscode单步调试Androidc++源码  目录步骤1.运行gdbclient.py脚本2.复制生成的launch.json并新建/home/jetson/android_aosp/aosp/.vscode/launch.json3.运行gdb即可,打断点参考 步骤注意:这个过程需要在Android源码环境中运行,可以使用adb端口转发工具,来......
  • VS Code开发React-Native及Flutter 开启无线局域网安卓真机调试问题
    VSCode开发React-Native及Flutter开启无线局域网安卓真机调试问题发布于 2020-10-2015:48:471.7K0举报笔者前段时间在做react-native开发,一直是有线连接安卓真机进行调试的。有线调试确实带来诸多麻烦,因为在调试过程中需要频繁和手机进行交互,导致有时候......
  • go语言ent教程:开启debug调试模式
    背景:ent模式是没有开启debug模式的 开启ent的调试模式有2种方法:一、通过配置选项开启client,err:=ent.Open("mysql","root:dev@123456@tcp(localhost:3306)/test?parseTime=True",ent.Debug()) 二、客户端调用Debug函数iferr:=client.Schema.Crea......
  • Lua断点调试 - 类似gdb的调试体验
    平时在做一个C++/Lua的项目,C++代码可以用gdb调试,但是Lua代码的调试却一直是个困扰人的难题。根据网上搜索的结果,无外乎都是用vscode插件调试,或者用socket之类的设施进行远程调试,个人都觉得太麻烦了,最好有个类似gdb那种直接在命令行中进行调试。不过经过我在网上的搜索,终于还是找......
  • Fast-Dds源码调试方案
    1、虚拟机安装:参考ubuntufastdds安装-墨尔基阿德斯-博客园(cnblogs.com);2、Ubuntu安装gdb:sudoaptinstallgdb3、查看gdb的安装路径(默认安装在/usr/bin/gdb):whichgdb4、配置调试参数,以示例程序HelloWorldExample为例:1)、重新编译fastdds库(只编译一次就行,更换......
  • 10.3 调试事件转存进程内存
    我们继续延申调试事件的话题,实现进程转存功能,进程转储功能是指通过调试API使获得了目标进程控制权的进程,将目标进程的内存中的数据完整地转存到本地磁盘上,对于加壳软件,通常会通过加密、压缩等手段来保护其代码和数据,使其不易被分析。在这种情况下,通过进程转储功能,可以将加壳程序的......
  • 10.2 调试事件获取DLL装载
    理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件,该事件可检测进程加载的模块信息,一旦有新模块被加载或装入那么则会触发一个通知事件,利用该方法并配合磁盘路径获取函数则可很容易的实现......
  • 10.3 调试事件转存进程内存
    我们继续延申调试事件的话题,实现进程转存功能,进程转储功能是指通过调试API使获得了目标进程控制权的进程,将目标进程的内存中的数据完整地转存到本地磁盘上,对于加壳软件,通常会通过加密、压缩等手段来保护其代码和数据,使其不易被分析。在这种情况下,通过进程转储功能,可以将加壳程序的......
  • 10.2 调试事件获取DLL装载
    理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件,该事件可检测进程加载的模块信息,一旦有新模块被加载或装入那么则会触发一个通知事件,利用该方法并配合磁盘路径获取函数则可很容易的实......
  • 10.3 调试事件转存进程内存
    我们继续延申调试事件的话题,实现进程转存功能,进程转储功能是指通过调试API使获得了目标进程控制权的进程,将目标进程的内存中的数据完整地转存到本地磁盘上,对于加壳软件,通常会通过加密、压缩等手段来保护其代码和数据,使其不易被分析。在这种情况下,通过进程转储功能,可以将加壳程序的......