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

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

3天内不再提示

Arm64程序调用通用寄存器的使用方法

麦辣鸡腿堡 来源:人人极客社区 作者:业余程序员plus 2023-07-28 11:28 次阅读

下面是Arm64程序调用标准规定的通用寄存器的使用方法。

参数寄存器(X0-X7) 函数参数数量小于等于8个时,使用X0-X7传递,大于8个时,多余的使用栈传递,函数返回时返回值保存在X0中。

调用者保存的临时寄存器(X9-X15)调用者若使用到了X9-X15寄存器,在调用子函数之前,需要将X9-X15寄存器保存到自己的栈中,子函数使用这些寄存器的时候不需要保存和恢复。

被调用者保存的寄存器(X19-X29) 被调用者若使用到这些寄存器,需要将其保存到自己的栈中,返回时从栈中恢复。

特殊用途的寄存器

X8是间接结果寄存器。用于传递间接结果的地址位置,例如,函数返回一个大结构。

X16-X17过程内调用暂存寄存器。。

X18平台寄存器。

X29是栈帧(FP)寄存器。保存了调用函数的栈帧地址。

X30保存了返回地址(LR)。函数返回后跳转到该地址处运行。

图片

实例下图是内核Oops时打印出的信息。第一张图片是寄存器信息,pc寄存器和sp寄存器对栈回溯有重要作用。第二张图是内核线程irq/231-dwc3栈数据的二进制转储,栈回溯就是在这些二进制数据中找到栈帧,从而找到调用的函数地址。

图片图片

下图是内核栈回溯的结果,发生异常函数的地址保存在异常栈中,不在内核线程irq/231-dwc3栈中。

图片

发生异常的函数可以根据pc寄存器得到,该函数是栈回溯的第一个函数。sp寄存器指向了第一个栈帧中的FP1寄存器,即0xffffffc0ee823b80地址,FP1向高地址偏移8字节得到LR1寄存器,即0xffffff80087369e4地址,该地址位于dwc3_ep0_stall_and_restart函数内,该函数是栈回溯的第二个函数。FP1指向了第二个栈帧的FP2,根据栈帧找到LR2,依次类推。所有的栈帧最终如下图所示,总共找到7个栈帧,因此irq/231-dwc3内核线程发生异常时总共有8个函数调用,和内核输出的函数调用关系一致。需要注意的是,代码里调用了该函数,但在栈回溯中没有找到符号,肯定是编译器优化,将该函数内联了,是否内联可以通过反汇编确认。

图片

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

    关注

    87

    文章

    10990

    浏览量

    206734
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541
收藏 人收藏

    评论

    相关推荐

    ARM寄存器的总结

    ARM处理共有37个寄存器: 1) 31个通用寄存器,包括程序计数
    发表于 07-19 21:20

    ARM状态下的通用寄存器有哪些

    ARM状态下的通用寄存器有哪些?ARM状态下的程序计数有哪些呢?
    发表于 10-21 06:47

    介绍一种利用Arm64架构的System counter来实现提供TSC的方法

    了不小的挑战。为此,本文分享Arm64架构下如何获取TSC的方法,以方便大家移植使用。首先,System counter是Arm64下独立于CPU core的计数,在系统上电时,会给
    发表于 06-02 17:12

    浅析openat系统调用arm64下的实现及使用原理

    open_test --static//反汇编objdump -D open_test > open_arm_asmopen_arm_asm可以看到将寄存器x8设置为系统调用号0x38
    发表于 06-02 17:48

    arm64和x86服务上运行的耗时来发现Docker在arm64架构下的性能问题

    ;上。Docker network子命令通过"exec"来调用外部的“iptables”程序来为容器配置网络数据包处理规则。在调用这个接口的时候,arm64机器总是比x86机器花费
    发表于 07-12 15:48

    ARM寄存器详解

    ARM有37个寄存器,其中31个通用寄存器,6个状态寄存器。   这里尤其要注意区别的是ARM
    发表于 07-10 10:04 2645次阅读

    arm程序状态寄存器访问指令

    arm程序状态寄存器访问指令
    发表于 01-04 13:11 0次下载

    IA64 应用程序寄存器

    IA64 应用程序寄存器
    发表于 01-04 13:11 0次下载

    浅谈ARM寄存器组织

    是32位的,但目前只使用了其中的12位。除了这6个状态寄存器外,其余的31个寄存器又称为通用寄存器ARM处理器共有7种不同的处理器模式,
    发表于 10-18 13:26 1次下载
    浅谈<b class='flag-5'>ARM</b><b class='flag-5'>寄存器</b>组织

    寄存器操作方法_对寄存器操作的通用方法总结

    本文主要详解寄存器操作方法以及对寄存器操作的通用方法总结,具体的跟随小编来了解一下。
    的头像 发表于 05-22 15:53 2.1w次阅读

    ARM64ARM32 的Linux程序区别在哪里

    arm64ARM64。我在示例中使用了AArch64寄存器,但我所描述的许多问题也发生在ARMv8-A 32位执行状态。
    的头像 发表于 08-09 09:51 2.6w次阅读
    <b class='flag-5'>ARM64</b>与<b class='flag-5'>ARM</b>32 的Linux<b class='flag-5'>程序</b>区别在哪里

    零基础学ARM程序状态寄存器访问指令解析

    一、程序状态寄存器访问指令ARM微处理器支持程序状态寄存器访问指令,用于在程序状态
    的头像 发表于 12-24 13:36 2372次阅读

    AArch64寄存器介绍

    作为 RISC 架构,AArch64 提供了大量的通用寄存器。除通用寄存器之外,本节还会介绍特殊寄存器
    的头像 发表于 08-24 09:57 4915次阅读

    ARM通用寄存器及状态寄存器详解

    笔者来聊聊ARM通用寄存器以及状态寄存器的认识与理解。
    的头像 发表于 01-06 14:58 4881次阅读

    arm三个寄存器在gdb调试时的作用

    ARM寄存器(r0、r1和r2)的作用非常重要。 1. R0寄存器: R0寄存器ARM处理器中的一个
    的头像 发表于 01-31 10:44 208次阅读