riscv64 qemu上进行Linux环境搭建与开发记录 2.环境准备 2.1 交叉编译工具链 如果按照之前的文章下载的Linux版本的交叉编译工具链是不带有gdb工具,所以可以下载一个bare/rtos.../riscv64-unknown-elf-gcc-8.3.0-2020.04.0-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-gdb build/platform...根据hw/riscv/virt.c来看,首先可以分析得到外设分布的地址。 ? 上述可以得到DRAM的地址空间是从0x80000000处开始的,而大小是我们传递参数时传递进去的。...2.注册系统内存 这部分的内存大小由外部传递 3.创建设备树 qemu也使用fdt创建了设备树,该设备树用于opensbi和uboot,这里的设备树放在qemu分配的内存的尾部。...并且会将该参数传递,这就是为什么前面进行gdb调试时,入口处会发现寄存器上有参数。 ? 根据riscv的寄存器的规则 ? 寄存器a0-a7是用于传递函数参数的。
上一次我们已经说到,操作系统的代码从硬盘复制到内存里了。 今天我们一起来看看,setup.s 都做了啥?...接下来的mov 指令就是把光标位置存储在这个内存地址 给到ds:0的地址处。因为ds现在是0x9000, 所以0x90000里存的就是光标的位置了。...接下来的一坨代码和上面逻辑差不多。调用中断程序获取点信息,存在内存里。...0x46, %si mov $INITSEG, %ax mov %ax, %es mov $0x0090, %di mov $0x10, %cx rep movsb 经过上面的代码处理,现在内存地址里存储的数据大致如下图...对于这种大量的数据,双方约定了一个内存地址(类似一个公用银行卡号),我存你取。 存储好数据之后,用cli 关闭中断.
在之前,我们会使用gdb连接到qemu,来获取DragonOS虚拟机里面的一些数据。但是,当涉及到驱动程序、中断及内存管理,我们有时候实在看不出自己的问题在哪里。...,还有watch指定的内存地址,观察数据与预期是否一致,观察数据被修改的时间点,找到异常点。...整体流程如下: gdb通过该脚本启动 GDB加载qemu-system-xxxx作为要调试的文件 GDB设置断点 在调试脚本中,运行qemu的命令,启动虚拟机。...比如,对于riscv的而言,我电脑的输出值是:(这个对于不同版本的dragonos都不一样,请以实际为准) -kernel arch/riscv64/u-boot-v2023.10-riscv64/u-boot.bin...监视内存地址 我们可以使用gdb的watch功能,监视QEMU的结构体的成员变量的变化,当变量发生变化时,就可以准确定位“更新状态”的代码上下文。这有助于我们对整个执行流程进行分析。
使用 GDB 调试时,涉及两个软件: ① 在 Git Bash 中运行的 riscv64-unknown-elf-gdb :它发出各类调试命令,比如连接调试服务软件 (T-HeadDebugServer...print /x a // 16进制打印 x 显示内存内容,比如: x 0x20000 x /x 0x20000 //16进制 info registers infor r 打印所有寄存器的值 set...) quit // 退出调试 上述调试过程中,用到的命令都有注释,摘抄如下: $ riscv64-unknown-elf-gdb benos_payload.elf // 开始调试 (gdb) target...riscv64-unknown-elf-gdb -tui benos_payload.elf 执行上述命令后,可以得到如下界面(源码窗口里的汉字是乱码,暂时无法解决): 使用 TUI 的便利在于可以方便地观看源码...,它表示在 Linux 系统下它是一个隐藏文件。在 Windows 的文件浏览器里我们可以看见它,但是在 Git Bash 里执行 ls 命令看不到它,需要执行 ls -a 命令才能看见。
0x1398 是断点的地址,表示断点被设置在程序代码的内存地址 0x1398 处。...x ptr 输出表示 GDB 尝试查看指针 ptr 所指向的内存地址上的内容时出现了问题: 0x0: 表示要查看的内存地址为 0x0。...Cannot access memory at address 0x0 意味着 GDB 无法访问内存地址 0x0。...说明: GDB 无法访问内存地址 0x0 是因为这个地址通常被操作系统保留为无效地址,用来表示空指针或者未分配的内存。...因此,当 GDB 尝试访问地址 0x0 时,操作系统会阻止这种访问,因为这个地址不属于程序的有效内存范围。
riscv32-linux-user riscv64-linux-user s390x-linux-user...aarch64-linux-user: 用于跑app aarch64_be-linux-user : 与上面不同的是,用来跑big-endian的app程序。 编译 ....msh /> 4.启动调试 很多情况下,我们完成软件的编写,需要定位的时候,可以利用gdb工具进行代码层面的调试。...-s -S -S 表示guest虚拟机一启动就会暂停 -s 表示监听tcp:1234端口等待GDB的连接 第一步: 开一个窗口,输入aarch64-elf-gdb. ?...其中c是continue的简写。会向下执行,执行到断点处。
://github.com/riscv/riscv-gnu-toolchain 项目地址 ❝https://github.com/Dmitriy0111/nanoFOX 1、darkriscv 一晚从头开始实现开源...MMU 可选的调试扩展允许通过 GDB >> openOCD >> JTAG 连接进行 Eclipse 调试 RISC-V 特权 ISA 规范 v1.10 中定义的机器、[Supervisor] 和 [...5、平头哥无剑100 平头哥无剑100 文档目录如下: |--Project //open source project work directory |--riscv_toolchain...Linux的全开源RISC-V微型电脑系统PicoRio项目,用于构建更透明、低功耗、定制能力强的高效能边缘计算平台。...://github.com/riscv/riscv-gnu-toolchain 项目地址 ❝https://rioslab.org 本文为OpenFPGA作者原创,未经本人授权禁止转载!
特点: 小型(7 系列 Xilinx 架构中的 750-2000 个 LUT) 高 fmax(7 系列 Xilinx FPGA 上为 250-450 MHz) 可选择的本机内存接口或 AXI4-Lite...5、平头哥无剑100 平头哥无剑100 文档目录如下: |--Project //open source project work directory |--riscv_toolchain...:64位、5级流水线、但发射顺序执行处理器,特征: 支持MMU,支持分页虚拟内存。...Linux的全开源RISC-V微型电脑系统PicoRio项目,用于构建更透明、低功耗、定制能力强的高效能边缘计算平台。...://github.com/riscv/riscv-gnu-toolchain 项目地址 ❝https://rioslab.org 本文为OpenFPGA作者原创,未经本人授权禁止转载!
下面通过一个表格简单的描述一下 工具 功能 addr2line 可以将指令的地址转换成文件名,函数名和源代码行数的工具 ar 库管理器,创建静态库 as 汇编器,主要处理汇编代码 objcopy 将文件转换成另外一种格式...,可以将C语言转换成可以执行的代码程序,但是现在还缺少在目标机器上运行程序时的C库,C库提供了一个标准的抽象层,可以执行基本的任务,包括内存分配、终端输出、文件访问等等。...对于不同的系统,也有着不同的C库,比如针对Linux桌面环境,有glibc或者eglibc或者uClibc等等。...riscv-gcc gcc主要的程序 riscv-gdb 通过外设接口,可以通过gdb调试 riscv-glibc 支持编译的程序在Linux运行的glibc库 riscv-newlib 支持编译的程序在...默认使用make时,链接的是newlib库,使用make linux时,链接的是glibc。 同时由于riscv有着非常多的arch组合,可以编译单独的arch,比如 .
由于对riscv的p扩展和v扩展的支持,使得其行为和实际硬件板子无差异。在qemu做算法优化和研究也是非常值得去尝试的。...利用qemu作为底层研究将会非常的高效。同时,善于借助gdb等调试工具,将能够非常容易的找到问题出现的点。...、腾讯云等云服务器,非常容易的实现业务的编程,同时调试方面,qemu的gdb调试功能也是非常的强大,也可以dump出内存进行ram parse分析。...5.进行嵌入式Linux的开发 进行Linux开发工作,如果深入去学习某一个设备的开发,当然少不了不断的对Linux的内核部分进行编译和下载,这是一个十分耗时的工作,如果只是进行应用程序的开发,可能感觉不到许多的差别...从分析linux的loader,分析Linux的驱动框架,内存管理,多核管理等等,都能够非常方便进行调试工作。 在实际硬件设备没有稳定之前,对软件项目进行评估,qemu是非常好用的工具。
因为该软路由是被安装在PVE上,使用kvm启动,所以可以使用gdb对其内核进行调试,也可以通过gdb修改程序内存和寄存器的值。从而达到任意命令执行的目的,获取Linux Shell。...大多数情况下,断下来的地址都是为0xFFFFFFFFxxxxxxxx,该地址为内核地址,然后在gdb界面输入continue,让其继续运行。...gdb,可以对程序内存寄存器进行修改,所以不需要这么长的shellcode,只需要执行下面的命令: set *0x00=xxxx set *0x04=xxxx ...... set $rdi=0x00...,会很快断在一个地址开头不是0xffffffff的地址,这就是用户态程序的地址空间了。...当一个新的bash程序运行时,内存重新进行了映射,所以使用gdb修改当前程序的上下文,并不会影响到之后运行的程序。
国内下载地址,每天更新一次 #git clone --recursive git@gitee.com:mirrors/riscv-gnu-toolchain.git $ cd riscv-gnu-toolchain...可以看到,有类似于Linux的设备描述节点。 3.3 调试 可以输入下面的命令。 qemu-system-riscv32 -nographic -machine sifive_e -kernel ....riscv64-unknown-elf-gdb nuttx ? 4.总结 nuttx这个物联网系统特点是与Linux的兼容,并支持原生的posix接口。...这对于做Linux的人来说,十分的友好,通过对这份代码的初步阅读,对该系统的功能还是比较强大的。...对于物联网操作系统来说,硬实时性不是最关键的,应用和程序的兼容性,可移植性强比较关键。nuttx这个系统的兼容性和Linux结合的很好。
,需要弄清楚两个概念: 1.向量中断 2.非向量中断 对于向量中断,其中断发生后,pc指针会根据中断的类型跳转到基地址+中断号*4的地址处去执行中断处理程序,做过stm32的,应该比较清楚向量中断的大概样子...当然,riscv也是支持这种向量中断,这样每个地址处会安排一个特定的中断处理函数,当中断发生后,跳转到特定的函数去执行即可。...2.中断向量表初始化 任何代码在最初的汇编级别的初始化时,都会指定向量的基地址。当然riscv也不例外。...mtvt寄存器中存放vector_base,该处存放向量地址入口,每个向量中断发生,则根据偏移执行对应的函数。...不难发现,这个是个芯来自定义扩展指令,CSR_JALMNXTI寄存器通过gdb解析可以看到如下的数据 ? 其中0x7ed则是该寄存器的地址。 那么一条指令是如何实现中断的处理的呢?
这篇文章旨在为读者提供一站式的 Linux 工具指南,从软件包管理 (apt) 到编译器 (gcc/g++)、自动化构建工具 (make),再到调试器 (gdb),我们将以清晰、系统化的方式为您逐步解析这些工具的功能和使用方法...四、Linux调试器-gdb使用 GDB(GNU Debugger)是GNU项目开发的一款功能强大的调试工具,用于调试C、C++、Fortran等编程语言编写的程序。...注意:finish指令可以快速的帮我们查看问题是不是出在当前函数中。 c(continue):从当前断点直接运行到下一个断点处。...thread 无 切换到指定线程 thread 3 内存操作 x/ 无 查看内存内容(支持格式化输出) x/4xw 0x123456 x/s 无 查看内存地址的字符串 x/s 0x7fff1234...info registers 无 查看所有寄存器内容 info registers set 无 修改内存地址内容 set *(int *)0x123456 = 42 源码查看 list l 查看当前代码上下文
在堆栈的外部(在 x86 和 x86_64 上向下增长,这意味着随着内存地址变大,内存地址会下降),程序的其他部分被存储和操作。通常,我们进行黑客攻击的想法是按照我们认为合适的方式重定向程序流。...通常,您会希望获得特权,通常是通过执行 shellcode - 或者无论您的最终目标是什么,但出于本教程的目的,我们只会将程序流重定向到我们无法访问的代码(在实践,这几乎可以是任何事情;甚至包括执行未正式存在的指令...(gdb) 马上,您应该会在内存中看到一堆不同指令序列的位置。...由于字节顺序,内存中的地址将向后,因此为了说明这一点,让我们尝试: (gdb) r 处的指令 0x55555555519b,打印“How u do do dat?”。 这个缓冲区溢出是非常微不足道的,大多数需要更多的工作来利用。
a.exe(windows)或a.out(linux) ** -Wall **:打开一些很有用的编译警告 ** -std **:指定C标准,如-std=99,使用C99标准 ** -g **:指示编译器...2、可以让被调试的程序在你所指定的调置的断点处停住。...* 程序的目的是交换a和b的值,然而并没有交换交换成功 * 原因: 函数的形参和在函数内部声明的变量都是该函数的局部变量。无法访问其他函数的局部变量。...如果要实现真正的交换,我们应该传入的是存储变量的地址,此时函数swap的形参类型应该为指针类型 PS: C语言的变量都是放在内存中的,而内存中间的每一个字节都有一个称为地址(address)的编号。...每一个变量都占有一定数目的字节(可以用sizeof运算符获得),其中第一个字节的地址称为变量的地址。
集成 CKLink 调试器,支持 OTG 烧录、 GDB 调试、串口打印,并将主芯片所有的信号全部引出,其中左右两侧兼容了树莓派的电源信号定义,可以很方便扩展模块。...等 RTOS ,也支持 Linux 系统。...启动 Git Bash 有两种方法: ① 点击 开始->Git->Git Bash ② 在文件浏览器进入某个目录后,在空白处点击右键弹出菜单后选择 Git Bash Here 在 Git Bash 中各种命令的用法跟...Linux 完全一样,比如也有cd、ls、rm 等命令。...在 Git Bash 中,对路径的表示方法也跟 Linux 一样,比如 D 盘下的 abc 子目录使用 /d/abc 表示,而不是 D:\abc。
-unknown-elf- or riscv64-linux-gnu- # perhaps in /opt/riscv/bin #TOOLPREFIX = # Try to infer the correct...elif riscv64-linux-gnu-objdump -i 2>&1 | grep 'elf64-big' >/dev/null 2>&1; then echo 'riscv64-linux-gnu...'riscv64-unknown-linux-gnu-'; else echo "***" 1>&2; echo "*** Error: Couldn't find a riscv64 version...# Disable PIE when possible (for Ubuntu 16.10 toolchain) # PIE是一种在内存中加载程序时地址空间随机化的安全特性,它可以增加程序的安全性,防止某些类型的攻击...-Ikernel -c $U/initcode.S -o $U/initcode.o # 这是生成 initcode.out 文件的命令,-N 表示生成无符号的可执行文件,-e start 指定程序的入口地址为
libisl-dev binutils-dev libelf-dev \ libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux...2.2 程序下载 启动esp32c3需要下面的固件 bootloader-esp32c3.bin partition-table-esp32c3.bin nuttx 上面两个固件可以到下面的地址下载 https...正常情况下,启动信息如下所示: 这样就可以启动gdb去连接openocd了。 3.5 启动gdb调试 对于esp32c3的程序,可以采用sifive提供的riscv交叉编译工具链中的gdb程序。...启动telnet控制端,这样就可以控制gdb的行为了。...\riscv64-unknown-elf-gdb.exe C:/work/example 这样可以正常看到代码执行的顺序了。
在Linux下C/C++必备的调试器就是GDB了,下面讲解如何查看GDB版本及安装GDB。 2....这里要注意,如果你用指针(或地址)来设置观察点,一定要解引用,* 指针才是对指针所指向的变量进行观察如果不解引用,那就是对指针变量本身(地址)进行观察。...val 的值 (gdb)p &val 打印变量 val 的地址 array 类型为 char ,地址每次+1增长1个字节。...这些信息会被存放在一块称为栈帧的内存空间中,并且每一个函数调用都对应一个栈帧(main 函数也有自己的栈帧,称为初始帧)。这些所有的栈帧都存放在内存中的栈区。...在Unix系统中,经常会将主内存 main memory 称为核心 core,而核心映像 core image 是指进程执行时的内存状态。
领取专属 10元无门槛券
手把手带您无忧上云