首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RISC-V64 opensbi启动过程

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是用于传递函数参数的。

8.4K32

Linux源码学习笔记day5 内存0地址处放的都是些什么玩意儿?

上一次我们已经说到,操作系统的代码从硬盘复制到内存里了。 今天我们一起来看看,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 关闭中断.

38610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    内核调试黑魔法:对QEMU自身进行调试,从而定位DragonOS问题

    在之前,我们会使用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的结构体的成员变量的变化,当变量发生变化时,就可以准确定位“更新状态”的代码上下文。这有助于我们对整个执行流程进行分析。

    1.5K10

    全志D1s裸机开发之体验第一个程序

    使用 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 命令才能看见。

    27810

    优秀的 VerilogFPGA开源项目介绍(三十六)-RISC-V(新增一)

    ://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作者原创,未经本人授权禁止转载!

    6.5K23

    riscv gcc工具链是如何被编译的

    下面通过一个表格简单的描述一下 工具 功能 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,比如 .

    2.2K40

    嵌入式编程中使用qemu能够做什么?

    由于对riscv的p扩展和v扩展的支持,使得其行为和实际硬件板子无差异。在qemu做算法优化和研究也是非常值得去尝试的。...利用qemu作为底层研究将会非常的高效。同时,善于借助gdb等调试工具,将能够非常容易的找到问题出现的点。...、腾讯云等云服务器,非常容易的实现业务的编程,同时调试方面,qemu的gdb调试功能也是非常的强大,也可以dump出内存进行ram parse分析。...5.进行嵌入式Linux的开发 进行Linux开发工作,如果深入去学习某一个设备的开发,当然少不了不断的对Linux的内核部分进行编译和下载,这是一个十分耗时的工作,如果只是进行应用程序的开发,可能感觉不到许多的差别...从分析linux的loader,分析Linux的驱动框架,内存管理,多核管理等等,都能够非常方便进行调试工作。 在实际硬件设备没有稳定之前,对软件项目进行评估,qemu是非常好用的工具。

    1.7K21

    使用 GDB 获取软路由的文件系统

    因为该软路由是被安装在PVE上,使用kvm启动,所以可以使用gdb对其内核进行调试,也可以通过gdb修改程序内存和寄存器的值。从而达到任意命令执行的目的,获取Linux Shell。...大多数情况下,断下来的地址都是为0xFFFFFFFFxxxxxxxx,该地址为内核地址,然后在gdb界面输入continue,让其继续运行。...gdb,可以对程序内存寄存器进行修改,所以不需要这么长的shellcode,只需要执行下面的命令: set *0x00=xxxx set *0x04=xxxx ...... set $rdi=0x00...,会很快断在一个地址开头不是0xffffffff的地址,这就是用户态程序的地址空间了。...当一个新的bash程序运行时,内存重新进行了映射,所以使用gdb修改当前程序的上下文,并不会影响到之后运行的程序。

    1.1K30

    从riscv底层原理分析gd32vf103的中断行为

    ,需要弄清楚两个概念: 1.向量中断 2.非向量中断 对于向量中断,其中断发生后,pc指针会根据中断的类型跳转到基地址+中断号*4的地址处去执行中断处理程序,做过stm32的,应该比较清楚向量中断的大概样子...当然,riscv也是支持这种向量中断,这样每个地址处会安排一个特定的中断处理函数,当中断发生后,跳转到特定的函数去执行即可。...2.中断向量表初始化 任何代码在最初的汇编级别的初始化时,都会指定向量的基地址。当然riscv也不例外。...mtvt寄存器中存放vector_base,该处存放向量地址入口,每个向量中断发生,则根据偏移执行对应的函数。...不难发现,这个是个芯来自定义扩展指令,CSR_JALMNXTI寄存器通过gdb解析可以看到如下的数据 ? 其中0x7ed则是该寄存器的地址。 那么一条指令是如何实现中断的处理的呢?

    2.4K40

    Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试

    这篇文章旨在为读者提供一站式的 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 查看当前代码上下文

    20510

    一个简单的基于 x86_64 堆栈的缓冲区溢出利用 gdb

    在堆栈的外部(在 x86 和 x86_64 上向下增长,这意味着随着内存地址变大,内存地址会下降),程序的其他部分被存储和操作。通常,我们进行黑客攻击的想法是按照我们认为合适的方式重定向程序流。...通常,您会希望获得特权,通常是通过执行 shellcode - 或者无论您的最终目标是什么,但出于本教程的目的,我们只会将程序流重定向到我们无法访问的代码(在实践,这几乎可以是任何事情;甚至包括执行未正式存在的指令...(gdb) 马上,您应该会在内存中看到一堆不同指令序列的位置。...由于字节顺序,内存中的地址将向后,因此为了说明这一点,让我们尝试: (gdb) r 处的指令 0x55555555519b,打印“How u do do dat?”。 这个缓冲区溢出是非常微不足道的,大多数需要更多的工作来利用。

    1.1K40

    Biu一下GDB

    a.exe(windows)或a.out(linux) ** -Wall **:打开一些很有用的编译警告 ** -std **:指定C标准,如-std=99,使用C99标准 ** -g **:指示编译器...2、可以让被调试的程序在你所指定的调置的断点处停住。...* 程序的目的是交换a和b的值,然而并没有交换交换成功 * 原因: 函数的形参和在函数内部声明的变量都是该函数的局部变量。无法访问其他函数的局部变量。...如果要实现真正的交换,我们应该传入的是存储变量的地址,此时函数swap的形参类型应该为指针类型 PS: C语言的变量都是放在内存中的,而内存中间的每一个字节都有一个称为地址(address)的编号。...每一个变量都占有一定数目的字节(可以用sizeof运算符获得),其中第一个字节的地址称为变量的地址。

    33930

    深入浅出GDB调试器

    在Linux下C/C++必备的调试器就是GDB了,下面讲解如何查看GDB版本及安装GDB。 2....这里要注意,如果你用指针(或地址)来设置观察点,一定要解引用,* 指针才是对指针所指向的变量进行观察如果不解引用,那就是对指针变量本身(地址)进行观察。...val 的值 (gdb)p &val 打印变量 val 的地址 array 类型为 char ,地址每次+1增长1个字节。...这些信息会被存放在一块称为栈帧的内存空间中,并且每一个函数调用都对应一个栈帧(main 函数也有自己的栈帧,称为初始帧)。这些所有的栈帧都存放在内存中的栈区。...在Unix系统中,经常会将主内存 main memory 称为核心 core,而核心映像 core image 是指进程执行时的内存状态。

    37910
    领券