RISCV-semi host原理以及实践

news/2024/11/20 6:33:36/

嵌入式裸机调试需要在有限资源的目标硬件上尽可能挖掘更多的信息,比如打印寄存器等等,但是即便看似很简单的串口打印,在有的情况下也是奢望,针对这种情况,能够有效利用主机资源协同调试的semi-host(半主机)技术应运而生。以下是关于semi-host的简单介绍。

  1. semi-host机制使用在目标处理器(arm,riscv等)上运行代的代码能够与正在运行调试器的主机进行通信,并使用其IO设施。
  2. 这些设施包括键盘,屏幕和磁盘IO.
  3. 嵌入式端使用C库中的函数(printf,scanf)能够使用主机的屏幕和键盘,而无需在目标系统上具备屏幕和键盘。
  4. semi-host最早由ARM在1995年定义,公开了ARM半主机规范,被很多调试器和C库支持,调试器比如jlink(rtti),trace32,以及ICE仿真器等,C库包括newlib,picolibc等。
  5. RISCV基于ARM版本也定义了自己的半主机规范。

semihost工作原理

semihosting=semi+hosting,表明了半主机操作一半在目标设备上执行,另一半在主机上执行,半主机通过一组特殊的软件指令序列来陷入主机,例如ARM的svc指令,RISCV的ebreak指令,这些指令会出发CPU进入异常执行流,在异常执行流中,执行调试代理程序处理异常,这些调试代理程序包括解析半主机命令并实现和主机通信的逻辑实现。

下图表示在不依赖串口的情况下,资源受限的目标平台将调试信息打印到主机的过程。

流程如下:

  • 目标设备上的应用程序调用标准库函数printf.
  • 在库的底层不会将调用重定向到串口,而是准备号要发送的数据后,使用特殊指令ebreak通知调试器。
  • 调试器收到通知后,检测到SEMI-HOST请求,然后执行对应的处理程序,将字符串显示出来。

下图是newlibc中 RISCV架构下触发SEMI-HOST请求的代码,在libgloss/riscv/semihost_syscall.h文件中。

由于CPU没有为semi-host保留异常号,为了将semihost触发的异常和其它异常区分开,在ebreak指令周围添加额外的指令来帮助调试器区分“半主机ebreak"和“常规ebreak".

其它约定包括,半主机调用号通过寄存器a0传递,调用参数的指针地质,通过a1寄存器传递,返回值放在a0中。

规范一共定义了24种类型的半主机调用:

支持半主机的C库
  1. Newlibc,如上截图。
  2. Picolibc,fork from newlibc.但是更轻量。
  3. Arm CMSIS。
QEMU半主机测试环境搭建

测试应用基于picolibc,编译方法如下:

$ sudo apt install gcc-riscv64-unknown-elf meson
$ git clone https://github.com/picolibc/picolibc.git
$ cd picolibc && mkdir build && cd build
$ ../scripts/do-riscv-configure
$ ninja
$ suso ninja install

编译生成了测试用例test/semihost/semihost-exit-extended-failure_rv64imafdc_lp64d, 之后安装

编译RISCV 64 QEMU:

参考博客Qemu在ARM和X86平台上的运行机制初探_papaofdoudou的博客-CSDN博客

这里使用8.0.0的QEMU,编译配置:

$ ./configure --target-list=arm-softmmu,aarch64-softmmu,i386-softmmu,x86_64-softmmu,riscv32-softmmu,riscv64-softmmu,aarch64-linux-user,arm-linux-user,riscv64-linux-user,x86_64-linux-user --audio-drv-list=alsa,sdl,pa --enable-system --enable-user --enable-linux-user --enable-sdl --enable-vnc --enable-virtfs --enable-kvm --enable-fdt --enable-debug --disable-strip --enable-debug-tcg --enable-debug-info --enable-debug --disable-strip --enable-vnc --prefix=/home/zlcao/semihost/install
$ make
$ make install

测试用例:

#include <stdio.h>int main(void)
{printf("%s line %d, hello semihosting.\n", __func__, __LINE__);return 0;
}

编译

$ riscv64-unknown-elf-gcc --specs picolibc.specs --oslib=semihost -march=rv64imac -mabi=lp64 -mcmodel=medany -static main.c -o main

--oslib=semihost告诉编译器使用picolibc的semihost版实现,因为正常情况下它也有一个实现。使用picolibc.specs将程序连接到0x80000000运行,这是大部分RISCV及其内存的起始地址,也是QEMU “virt”及其的内存基址。由于使用的工具链是裸机工具链,这个地址是物理地址。

使用 qemu "virt" -serial stdio查看没有任何输出,因为我们用的是半主机的printf调用,没有用到串口终端,所以这里没有任何输出。

./../install/bin/qemu-system-riscv64 -M virt -bios main -display none -serial stdio

但是当我们加上-serial null -semihosting运行时,输出便出现了,-serial null的目的是禁止标准输出,这样如果有输出,一定是半主机机制的,方便对照,不加也行。

$ ./../install/bin/qemu-system-riscv64 -M virt -bios main -display none -serial null -semihosting

-bios目的是禁止opensbi启动。

结束

http://www.ppmy.cn/news/513585.html

相关文章

依靠自我

必读网&#xff08;http://www.beduu.com&#xff09;整理 依靠自我 我们需要爱默生式的思想家 当所有的编译工作都完成之后&#xff0c;我突然发现自己在编译过程中经常出现的“为什么要编译爱默生的文章”的疑问都变得多余了&#xff0c;也就是说&#xff0c;我突然认为&…

华为魔术2手机拆机图解_荣耀Magic2手机内部做工如何?荣耀Magic2手机拆机

荣耀Magic2手机内部做工如何&#xff1f;荣耀Magic 2手机搭载的是麒麟970处理器&#xff0c;售价3799元起&#xff0c;这款手机的内部做工究竟如何呢&#xff1f;接下来的文章中小编将会带来这款手机的拆机全过程图解评测&#xff0c; 荣耀Magic2手机拆机 1、首先关机&#xff…

机器学习期末复习 集成学习

1.集成学习的一般结构&#xff1f; &#xff08;1&#xff09;产生一组个体学习器 &#xff08;2&#xff09;用某些策略将个体学习器结合 2.&#xff08;判断&#xff09;集成学习主要分为并行算法和串行算法。其中随机森林属于串行算法&#xff0c;即每一颗树的学习受其他树…

随机森林算法

文章目录 1. 随机森林原理1.1 集成学习1.2 Bagging算法1.3 随机森林算法 2. 随机森林算法步骤3. 随机森林特点4. 随机森林的Python应用4.1 RandomForestClassifier随机森林分类4.2 RandomForestRegressor随机森林回归 5. 源码仓库地址 1. 随机森林原理 1.1 集成学习 集成学习…

模糊测试基本介绍

模糊测试基本介绍 覆盖率指引的模糊测试方法获得覆盖率的四种追踪方式1&#xff1a; 使用编译器向基本块边缘插桩&#xff0c;可以准确地插桩并易于优化&#xff0c;但需要源码已知。静态二进制重写&#xff0c;不需要源码&#xff0c;仍在研究&#xff0c;因为静态代码插桩准…

【MTK】【功耗】息屏待机功耗超标

问题背景 【预置条件】进入camera后按home键退出&#xff0c;息屏&#xff0c;紧接着测试息屏功耗即可 【操作步骤】灭屏, 充电到91%开始待机 【实际结果】测试机待机电流大于25mA 【预期结果】平均功耗≤25mA息屏待机功耗一般都是系统那边先做分析,他们会看是哪个模块存在问题…

联想推出ThinkServer DN8836,超大容量存储服务器的性价比首选

联想推出ThinkServer DN8836,超大容量存储服务器的性价比首选 突如其来的新冠疫情让各行各业都看到了利用智能基础架构启动智能化转型,降本增效,优化资源配置的必要性。而从中央到地方近期加紧布局的新基建更是为这一进程按下了加速键。企、事业单位智能化转型的过程中必将产生…