d1-nezha-rtthread与rtthread的cv1800b反汇编文件分析,及测试是否进入os.bin

2023-12-11 01:44

本文主要是介绍d1-nezha-rtthread与rtthread的cv1800b反汇编文件分析,及测试是否进入os.bin,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

(1)PLCT实验室实习生长期招聘:招聘信息链接
(2)因为根据教程,我一直Milkv-duortthread一直没有进展,据我所知,一般只有entry函数前面部分有差异,然后是entry—>rtthread_startup—>rt_hw_board_init函数中系统时钟配置内容不同。然后调整一下FlashSRAM即可。
(3)因为第一次做操作系统的移植工作,因此只能走一步看一步了。我先对比研究一下d1-nezha-rtthreadrtthreadcv1800b反汇编文件。大概分析一下我的问题到底出现在哪里再尝试开始一步一步的做测试工作。
(4)阅读本文前,请先看:
<1>生成fip.bin在Milkv-duo上跑rtthread的相关尝试,及其问题分析;
<2>如何自己生成fip.bin在Milkv-duo上跑freertos;

研究反汇编

前期准备

(1)首先,我们先准备好d1-nezha-rtthreadrtthreadcv1800b反汇编文件。

rtthread反汇编文件生成

(1)这里的PATH=路径是你交叉编译工具链的路径。

export PATH=/opt/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin:$PATH
riscv64-unknown-elf-objdump -d rtthread.elf > rtthread_disassembly.txt

d1-nezha-rtthread反汇编文件生成

riscv64-unknown-elf-objdump -d rtthread.elf > d1s_disassembly.txt

反汇编对比分析

d1-nezha-rtthread反汇编分析

(1)d1-nezha-rtthread的反汇编非常好研究,极其简单。

  • _start前期工作,可能包括设置特定的控制寄存器(CSRs),关闭机器级中断,生成相对地址,并将生成的地址存储在寄存器 t0 中。
  • trap_entry,应该是设置中断处理入口地址为t0,初始化栈指针。
  • clear_bss,清除bss。
  • entry,之后的内容一致。

在这里插入图片描述

rtthread反汇编分析

(1)RT-Thread的反汇编就略微的复杂一点点
<1>首先是跳转到g_wake_up函数中。

  • boot_hartid,应该是对中断的相关寄存器进行配置。
  • trap_entry,清空ra到t0这32个寄存器。
  • __global_pointer,应该是栈分配吧。
  • init_bss,清除bss,这部分RT-Thread仓库和D1S仓库对bss操作不一样。
  • sbi_initRT-Thread仓库中有这个函数,但是D1S仓库中没有进行这个函数调用。

在这里插入图片描述
在这里插入图片描述

<2>g_wake_up函数执行完成之后,会跳转到primary_cpu_entry中执行。

  • rt_hw_interrupt_disable,关闭了全局中断。
  • __rt_assert_handler,应该是进行一些检查和断言吧。
  • rt_assert_set_hook,进行一些寄存器值的保存和加载,并且与栈操作相关。
  • entry,之后的内容一致。

在这里插入图片描述

测试是否进入了rtos.bin

找到第一个执行文件

(1)既然知道问题所在了,对启动流程有了一个初步认识之后,那么我们是不是可以在进入rtos.bin之前加一个打印信息呢?

在这里插入图片描述

(2)既然有了这个想法,那么就马上开干。我们知道_start中会调用trap_entry__stack_cpu0clear_bssentry这几个函数。于是我们可以尝试使用grep命令,查看这几个函数分别在哪几个文件中出现。

grep -r "trap_entry"
grep -r "__stack_cpu0"
grep -r "clear_bss"
grep -r "entry"

(3)通过查找的信息,我们很明显可以知道,大概率是在_start大概率是在startup_gcc.c或者是startup_gcc.S中出现。

在这里插入图片描述

(4)此时我们需要移动到仓库的根目录。然后执行如下查找指令,就可以找到startup_gcc.S文件。

cd ../..
find -name "startup_gcc.*"

在这里插入图片描述

修改文件内容

(1)这里我们需要将如何自己生成fip.bin在Milkv-duo上跑freertos这篇博客修改好的串口驱动程序移植过来。
(2)因为我这边反正是做测试使用,就大胆的把串口驱动文件放在了存放RT-Thread内核源码的src目录下了。这样就不会出现找不到文件的情况,减少麻烦。

在这里插入图片描述

(3)这里我们就在drv_uart中加入一个打印的测试函数print_zyx

/* --- drv_uart.h --- */
void print_zyx(void);
/* --- drv_uart.c --- */
void print_zyx(void)
{dw8250_uart_init();dw8250_uart_putc('z');dw8250_uart_putc('y');dw8250_uart_putc('x');
}

在这里插入图片描述
在这里插入图片描述

(4)在libcpu/risc-v/c906/startup_gcc.S中调整

_start:jal print_zyx/*disable interrupt*/csrw mie, zero

在这里插入图片描述

(4)在bsp/d1-nezha中编译,然后使用grep命令查找print_zyx是否被编译进来。

scons -c
scons -j10
grep -r "print_zyx"

在这里插入图片描述

生成fip.bin

(1)执行如下命令,生成fip.bin,生成的fip.bin在build目录下。

# d1-nezha-rtthread仓库中
cd  ${d1-nezha-rtthread_DIR}/bsp/d1-nezha
cp rtthread.bin rtos.bin
mv rtos.bin ${duo-toolbox_DIR}/debugloader/duoRVOS
# 进入duo-toolbox仓库路径
cd ${duo-toolbox_DIR}/debugloader/
export PATH=`pwd`/../host-tools/gcc/riscv64-linux-musl-x86_64/bin:$PATH
export PATH=`pwd`/../host-tools/gcc/riscv64-elf-x86_64/bin:$PATH
cd duoRVOS/
make clean
make
cd ../../fip/
cp ../debugloader/duoRVOS/os.bin .
make fsbl-build

(2)最终会出现一个乱码,具体原因不清楚。

在这里插入图片描述

(3)为了确保print_zyx是否编译进入了os.bin,我们可以看看os.asm文件,找到payload_bin。我们能够发现csrw mie,zero指令前面有一个jal的跳转指令,说明是成功将print_zyx是否编译进入了os.bin。至于为什么会出现乱码打印,还在研究中。

在这里插入图片描述

参考文章

(1)面包板社区:教你动手移植RT-Thread到国产MCU
(2)C站:生成fip.bin在Milkv-duo上跑rtthread的相关尝试,及其问题分析;
(3)C站:如何自己生成fip.bin在Milkv-duo上跑freertos;

这篇关于d1-nezha-rtthread与rtthread的cv1800b反汇编文件分析,及测试是否进入os.bin的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/479017

相关文章

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

python中os.stat().st_size、os.path.getsize()获取文件大小

《python中os.stat().st_size、os.path.getsize()获取文件大小》本文介绍了使用os.stat()和os.path.getsize()函数获取文件大小,文中通过示例代... 目录一、os.stat().st_size二、os.path.getsize()三、函数封装一、os

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11