0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

rt smart应用程序调试记录

冬至子 来源:zms123456 作者:zms123456 2023-09-13 16:29 次阅读

本文是在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后成功暂停

1.jpg

libc库查看
本工程采用musl libc,可以自行下载查看源码

调试记录
以下按函数执行的顺序来进行记录

_start
该函数将当前用户态栈指针设置为0xffff80000000,为用户空间较高的地址,之后跳到_start_c

_start_c

1.jpg

所传入的参数*p地址为smart预先设置的0xfffffffff000。这里存放了应用程序初始化所需的参数,由操作系统设置,最后调用传参为__libc_start_main(main, 1, "/bin/smart-fetch",_init,_fini, 0 )

__libc_start_main

1.jpg

首先获得程序的环境变量(操作系统设置,含有操作系统名称,执行文件的信息等)
调用__init_libc(envp, "/bin/smart-fetch")
asm ( "" : "+r"(stage2) : : "memory" )表示保证在之后stage2采用更新后的值,避免使用缓存的值

__init_libc

1.jpg

该函数前面主要是通过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

1.jpg

首先执行__libc_start_init进行初始化
之后调用main函数获取返回值
之后调用exit(main_ret)来进行清理

__libc_start_init

1.jpg

调用事先注册好的初始化函数列表__init_array_start。
本处调用了frame_dummy函数,该函数并不是musl库里的函数,而是gcc编译时插入的函数。该函数调用初始化函数(即定义了__attribute__((constructor))的函数),并调用register_tm_clones来注册多线程下的克隆函数。因为这个程序无初始化函数和多线程的特性,所以该函数实际上并未执行任何操作。

exit

1.jpg

__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自动做的事(通过对比缺页触发前后寄存器值得出):

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5317

    浏览量

    120010
  • 存储器
    +关注

    关注

    38

    文章

    7452

    浏览量

    163606
  • RT-Thread
    +关注

    关注

    31

    文章

    1272

    浏览量

    39923
  • GDB调试
    +关注

    关注

    0

    文章

    24

    浏览量

    1437
收藏 人收藏

    评论

    相关推荐

    使用GDB调试Linux应用程序

    本篇讲解使用GDB调试Linux应用程序,以下以 `hellowld.c` 为例介绍 GDB 的调试入门。
    发表于 06-27 15:48 449次阅读

    RT-Thread Smart 入门指南

    、qemu 工具等。编译应用程序# 进入到 rt-smart 目录cd rt-smart# 设置对应的环境变量,和原 RT-Thread 相比,多了 RTT_CC_PREFIX 环境变
    发表于 03-29 06:40

    RT-Smart的资料合集

    时,需要使用 GDB 直接进行代码调试。本文档记录了以 RT-Thread qemu-vexpress-a9 BSP 为例,使用 GDB 对 RT-Smart 进行代码
    发表于 03-22 15:06

    快速上手RT-Thread Smart入门指南

    应用程序当要编译应用程序时,使用方式和 Linux 的类似:编译 rt-smart 内核编译无误后,会在当前目录下生成 kernel7.img 文件,这个是树莓派上 32 位的版本。目前
    发表于 04-01 17:38

    分析一下在rt-smart操作系统中将一个应用程序运行起来要经过哪些步骤

    1、RT-Smart ELF 应用程序加载运行在用户态应用程序处理的任务中,elf 加载运行是一个比较重要的步骤,下面就分析一下在 rt-smart 操作系统中,想要将一个
    发表于 04-13 17:17

    请问RT -SMART支持GDB调试吗?

    RT-SMART介绍,应用程序开发可以用GDB在线调试。现在发布的版本已经具有还功能了吗?原文摘录:为了更好的支持应用程序调试,在
    发表于 04-20 09:35

    rt-smart操作系统中将ELF应用程序运行起来要经过哪些步骤

    1、RT-Smart ELF应用程序加载运行在用户态应用程序处理的任务中,elf 加载运行是一个比较重要的步骤,下面就分析一下在 rt-smart 操作系统中,想要将一个
    发表于 06-13 18:18

    RT-Thread Smart快速上手

    : done building targets.编译应用程序rt-smart没有开放用户态程序依赖的第三方库librtthread源码,因此ARM926的处理器暂时无法使用用户态APP。原作者:Yanye0xFF
    发表于 10-26 14:48

    rt-smart应用程序系统调用实现过程是怎么样的?

    rt-smart应用程序系统调用实现过程是怎么样的? 比如open时候怎么一步一步切换到内核态的?
    发表于 09-08 17:00

    树莓派上rt-smart的应用编程入门

    文章,一些介绍及树莓派上rt-smart的应用编程入门(更多的从应用程序角度入手)。后续还包括在rt-smart上的不同应用程序介绍: wget curl移植 busybox移植 sd
    的头像 发表于 05-13 14:10 3111次阅读
    树莓派上<b class='flag-5'>rt-smart</b>的应用编程入门

    如何在rt-smart简化应用程序开发

    RT-Thread Smart做为一个“新”的系统,在开发上相比原来的RT-Thread模式还是存在着挺大的不同。
    的头像 发表于 01-04 15:59 1941次阅读

    RT-Smart ELF应用程序加载运行过程分析

    在用户态应用程序处理的任务中,elf 加载运行是一个比较重要的步骤,下面就分析一下在 rt-smart 操作系统中,想要将一个应用程序运行起来要经过哪些步骤。
    的头像 发表于 11-02 09:57 935次阅读

    基于xmake的RT-Thread Smart用户态开发教程

    RT-Thread Smart(以下简称 Smart) 是基于 RT-Thread 操作系统上的混合操作系统,简称为 rt-smart,它把
    的头像 发表于 06-07 11:44 1284次阅读
    基于xmake的<b class='flag-5'>RT</b>-Thread <b class='flag-5'>Smart</b>用户态开发教程

    带有RT-Thread的Arduino应用程序

    电子发烧友网站提供《带有RT-Thread的Arduino应用程序.zip》资料免费下载
    发表于 06-14 11:22 6次下载
    带有<b class='flag-5'>RT</b>-Thread的Arduino<b class='flag-5'>应用程序</b>

    基于xmake的RT-Thread Smart用户态开发教程

    RT-Thread Smart(以下简称 Smart) 是基于 RT-Thread 操作系统上的混合操作系统,简称为 rt-smart,它把
    的头像 发表于 09-14 11:48 1080次阅读
    基于xmake的<b class='flag-5'>RT</b>-Thread <b class='flag-5'>Smart</b>用户态开发教程