Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
新手学习
rt smart应用程序调试记录
发布于 2023-08-16 19:56:20 浏览:607
订阅该版
[tocm] 本文是在qemu-virt64-aarch64下运行smart-fetch的调试记录 ## 准备 ### 编译 按照userapps的readme进行编译,编译前键入如下命令,即可编译出带调试信息的userapps ``` xmake f --mode=debug ``` ### gdb配置 在调试过程中需要进入内核,所以需要同时加载内核和应用程序的elf符号表。设置`.gdbinit`文件如下: ``` target remote localhost:1234 file ../../../rt-thread/bsp/qemu-virt64-aarch64/rtthread.elf add-symbol-file ../../apps/build/rootfs/bin/smart-fetch ``` 首先使用`readelf`工具查看`smart-fetch`程序,发现其`entry point`是`0x200000`的`_start`,于是在gdb中打断点`b *0x200000`(或`b _start`),在输入`smart-fetch`后成功暂停 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230816/040bd5c55e49f175fce3ebfc27814650.png.webp) ### libc库查看 本工程采用musl libc,可以自行下载查看源码 ## 调试记录 以下按函数执行的顺序来进行记录 ### _start 该函数将当前用户态栈指针设置为`0xffff80000000`,为用户空间较高的地址,之后跳到`_start_c` ### _start_c ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230817/3a7bffc3f2e3f69af8cfeb8ed543bbb9.png) 所传入的参数`*p`地址为smart预先设置的`0xfffffffff000`。这里存放了应用程序初始化所需的参数,由操作系统设置,最后调用传参为`__libc_start_main(main, 1, "/bin/smart-fetch",_init,_fini, 0 )` ### __libc_start_main ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230817/e29a7a146b77c9b37d51d547c368b319.png) - 首先获得程序的环境变量(操作系统设置,含有操作系统名称,执行文件的信息等) - 调用`__init_libc(envp, "/bin/smart-fetch")` - `__asm__ ( "" : "+r"(stage2) : : "memory" )`表示保证在之后`stage2`采用更新后的值,避免使用缓存的值 ### __init_libc ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230817/f3cf4ac044e264f83d51eb04146f2cef.png) 该函数前面主要是通过`envp`来获取一些程序信息如pagesize等,接下来执行`__init_tls`和`__init_ssp` ### __init_tls 该函数目的是初始化线程局部存储(thread local storage)。它需要根据elf文件的类型为`PT_TLS`的段来对线程局部存储进行初始化。这里由于smart-fetch不是多线程程序,没有`PT_TLS`类型的段,故该函数在这里没有进行实际的操作。 ### __init_ssp 该函数是初始化栈保护机制,但这里并未实现该机制。执行dummy函数,不做任何操作 ### libc_start_main_stage2 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230817/7e84431503fd3bb25f216fa8e9205a1a.png) - 首先执行`__libc_start_init`进行初始化 - 之后调用`main`函数获取返回值 - 之后调用`exit(main_ret)`来进行清理 ### __libc_start_init ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230817/c07601a0a0da9ad648cdabc920597f36.png) - 调用事先注册好的初始化函数列表`__init_array_start`。 - 本处调用了`frame_dummy`函数,该函数并不是musl库里的函数,而是gcc编译时插入的函数。该函数调用初始化函数(即定义了`__attribute__((constructor))`的函数),并调用`register_tm_clones`来注册多线程下的克隆函数。因为这个程序无初始化函数和多线程的特性,所以该函数实际上并未执行任何操作。 ### exit ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230817/43ae4592437d3d2d46f5814d62e00711.png) - `__funcs_on_exit`:无操作 - `__libc_exit_fini`:该函数对应于`__libc_start_init`,调用解构函数,注销多线程克隆函数,在这里也没有实质性的操作 - `_stdio_exit`:关闭所有打开文件及标准输入、输出、错误文件 - `_Exit`:调用`SYS_exit_group`系统调用,之后就是操作系统进行资源回收 ## 缺页异常处理 当访问一个不存在页时,aarch改变的寄存器 - sp 0xffff80000000 -> 0xffff0000002b6520 - pc 0x20008 -> 0xffff0000000c6400 - cpsr 0 -> 0x3c5 - elr_el1 0x200000 -> 0x200008 - sp_el0 0 -> 0xffff80000000 - ESR_EL1 0-> 0x92000045 - FAR_EL1 0 -> 0xffff7fffffd0 aarch64自动做的事(通过对比缺页触发前后寄存器值得出): -
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
zms123456
这家伙很懒,什么也没写!
文章
3
回答
0
被采纳
0
关注TA
发私信
相关文章
1
大神们,rt-thread启用WDT了,但是还是没启动,怎么办?
2
求一个师傅带带队,有偿交学费 肯吃苦
3
自己按照官方手册 在drv_gpio.c里面找不到PIN脚信息
4
rtt studio f4默认生成的代码无法使用
5
官方例程中的 USB设置配置不成功
6
STM32F4的虚拟串口 的USB时钟如何配置
7
AT24CXX 软件包函数 at24cxx的问题
8
rtthread studio和bsp文件之间生成的区别和联系?
9
pwm根据手册修改为对应的引脚后无效
10
文件系统挂实验 ls命令异常
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部