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

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

3天内不再提示

ARM64与ARM32 的Linux程序区别在哪里

PCB线路板打样 来源:LONG 2019-08-09 09:51 次阅读

ARM为其架构引入64位支持时,它旨在与以前的32位软件兼容。但对于Linux程序员来说,仍然存在一些可能影响代码行为的重大差异。以下是我们发现的一些内容以及我们为他们开发的解决方法。

我本来打算将这篇文章称为“ARMv8 for Linux程序员的新功能?”然而,我认为“有什么不同”更为贴切。而且,仅仅为了记录,“ARMv8-A”是指AArch64,带有A64指令集,也称为arm64或ARM64。我在示例中使用了AArch64寄存器,但我所描述的许多问题也发生在ARMv8-A 32位执行状态。

为了帮助构建此处讨论的问题,让我开始通过给出一些我们在撤销时所拥有的代码库的背景知识。我们的核心技术是记录和重放引擎,它通过将所有非确定性输入记录到程序并使用即时编译(JIT)来跟踪程序状态来工作。我们的技术始于x86(32和64)当我们开始调整它以适应AArch64时,我已经在ARM 32位上获得了相当完整,成熟的支持。几乎所有的低悬的水果都被抓住了之后我加入了公司(以及很多相当高的树,为了公平)我们在转向ARMv8时遇到了一些棘手的问题。

这让我想到了我的第一个简单但可能有用的观察结果:ARM64与ARM 32位(又名AArch32)相比,与x86更相似。 ARM64仍然非常RISC(尽管加密加速指令确实导致RISC架构中的眉毛抬起)。所以我不打算试图涵盖x86和ARM版本之间的许多差异。我也不想重新审视AArch32和AArch64之间的差异 - 已经有很好的资源来探索这些差异。

此外,许多ARM与ARM64资源都集中在指令集和架构差异上。这些差异与大多数Linux用户空间应用程序开发人员并不十分相关,超出了非常明显的范围,例如“你的指针更大。”但是,正如我们发现的那样,对于Linux用户空间开发人员来说存在重要差异,其中四个我将会在这里讨论。这些差异分为几类,一些属于多个类别。类别是:

由于迁移使用相当新的内核版本而产生的差异。

由于体系结构和指令集(这与用户空间程序员有关)的差异。

Ptrace 差异。我们经常使用 ptrace ,所以这对我们来说非常重要。

我将在下一节中尝试使用以下格式:

该区域的简要说明。

有什么不同?为什么会有所不同?(有时通过查看一些装配说明比通过罗嗦的描述更容易理解行为的变化,所以我会提供那段代码。)

我们是如何遇到它的?

我们是如何克服它的?

在哪里可以找到更多信息

1。对 ptrace 的更改

ptrace 为用户空间程序提供了进程跟踪功能。

有一个编号对 ptrace()接受的请求的更改。这些更改产生了最令人愉快的所有不兼容性:编译错误。我们的错误报告是针对未定义的符号PTRACE_GETREGS(对于通用寄存器),PTRACE_GETFPREGS(对于浮点和SIMD寄存器),以及PTRACE_GETHBPREGS(对于硬件断点寄存器),以及这些请求的SET版本。

ptrace 的 man 页面在解决方面毫无帮助这些错误,所以我们挖得更深。我们看了一下内核源代码,结果发现通常存在独立于体系结构的 ptrace 代码路径(kernel/ptrace.c中的ptrace_request()),以及独立的体系结构依赖路径(例如arch/arm/kernel/ptrace.c中的arch_ptrace()。虽然arm64版本有一个用于AArch32应用程序的compat_arch_ptrace,但arm64 arch_ptrace()直接调用ptrace_request()并且不添加任何其他 ptrace 请求类型。

解决方案是使用PTRACE_GETREGSET和PTRACE_SETREGSET具有各种不同的参数来读取这些寄存器。

这是GETREGS样式请求和最接近的等效GETREGSET请求的表。通过 addr ptrace()参数的不同参数获取不同的REGSET。

ARM 32位 AArch64
GETREGS NT_PRSTATUS
GETFPREGS NT_PRFREG
GETHPBREGS NT_ARM_HW_BREAK
NT_ARM_HW_WATCH

表1. ARM 32位和最接近的等效AArch64 ptrace请求。

请注意,NT_ARM_HW_BREAK和NT_ARM_HW_WATCH在GETREGSET请求中的行为相同。

使用GETREGSET并不像使用GETREGS那么简单。对于像这样的GETREGS请求:

ptrace(PTRACE_GETREGS,0,0,regs);

GETREGSET看起来像这样:

struct {void * buf; size_t len;} my_iovec = {regs,sizeof(* regs)};
ptrace(PTRACE_GETREGSET,0,(void *)NT_PRSTATUS,& my_iovec);

注意也是我已经说过“最接近的等效GETREGSET请求。”当然,AArch64寄存器组与ARM 32位寄存器不同,但两者之外的寄存器组之间存在更多差异。

图图1示出了从ARM 32位GETREGS和AArch64 GETREGSET指令返回的寄存器的图。

ARM64与ARM32 的Linux程序区别在哪里

图1. GETREGS和GETREGSET。

熟悉AArch64的人可能会注意到GETREGSET我们已经获得了“cpsr”注册,但硬件架构没有。 GETREGSET返回的内容已经从AArch64上可单独访问的字段合成为类似cpsr的布局。

两者之间更显着的差异是GETREGSET缺少orig_r0(或orig_x0)。这种缺乏与系统调用有关。在ARM 32位上,系统调用编号放在r7中,并且系统调用参数在系统调用(SVC)指令之前放在参数寄存器r0-r3中。从系统调用返回的值位于r0(根据通常的APCS,在特殊情况下为r7)。内核从 syscall 返回后,orig_r0将原始的第一个参数提供给 syscall (已被返回值覆盖)。

I实际上不知道“正常”应用程序应该使用什么用于这个原始的第一个参数。我们使用它来支持 restart_syscall ,其中返回值为ERESTART_RESTARTBLOCK。

不幸的是,缺乏orig_x0对我们来说是个问题,我们还没有在任何情况下解决。如果我们已经记录了系统调用的条目,那么我们就拥有了所需的所有信息。但是,如果我们在 restart_syscall 期间附加了,那么我们就不知道x0的原始值。我们唯一的选择是允许内核重新启动 syscall ,但这次重启对我们来说是低效的,因为我们无法优化系统调用的录制。

回到GETREGS与GETREGSET的主题:GETHBPREGS和NT_ARM_HW_BREAK也有很大不同。对于GETHBPREGS请求,使用 ptrace 调用中的 addr 字段来请求特定的硬件断点寄存器。 NT_ARM_HW_BREAK返回所有硬件断点寄存器。

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

    关注

    134

    文章

    9082

    浏览量

    367339
  • PCB打样
    +关注

    关注

    17

    文章

    2968

    浏览量

    21692
  • 华强PCB
    +关注

    关注

    8

    文章

    1831

    浏览量

    27747
  • 华强pcb线路板打样

    关注

    5

    文章

    14629

    浏览量

    43026
收藏 人收藏

    评论

    相关推荐

    ARM总共有几种架构?ARM各架构之间的区别在哪

    ARM总共有几种架构?ARM各架构之间的区别在哪?基于各ARM架构设计的内核型号有哪些?分别有哪些应用领域?
    发表于 07-01 09:10

    请教一下大神arm64硬件断点和arm有哪些区别

    请教一下大神arm64硬件断点和arm有哪些区别?求解
    发表于 08-12 11:38

    微软推出首个可用于ARM64设备的x64仿真

    微软通过开发者博客宣布,已通过Windows内部开发频道推出了第一个可用于ARM64设备的x64仿真的预览版Build 21277,这意味着使用ARM芯片的笔记本用户可以从Windows商店或其他渠道安装x
    的头像 发表于 12-11 09:14 1976次阅读

    ARM64 Linux内核页表的块映射

    内核文档Documentation/arm64/memory.rst描述了ARM64 Linux内核空间的内存映射情况,应该是此方面最权威文档。 以典型的4K页和48位虚拟地址为例,整个内核空间
    的头像 发表于 01-04 13:37 2593次阅读
    <b class='flag-5'>ARM64</b> <b class='flag-5'>Linux</b>内核页表的块映射

    RTK和GPS定位的区别在哪里

    RTK和GPS定位的区别在哪里
    发表于 05-08 10:08 76次下载

    串口屏和并口屏的区别在哪里

    串口屏还是并口屏好用?区别在哪里?
    的头像 发表于 01-23 09:53 9807次阅读

    Core 3399Pro JD4文件系统Linux根文件系统镜像(arm64&arm32

    电子发烧友网站提供《Core 3399Pro JD4文件系统Linux根文件系统镜像(arm64&arm32).txt》资料免费下载
    发表于 09-02 10:41 1次下载
    Core 3399Pro JD4文件系统<b class='flag-5'>Linux</b>根文件系统镜像(<b class='flag-5'>arm64</b>&<b class='flag-5'>arm32</b>)

    Core 3399 JD4文件系统Linux根文件系统镜像(arm64&arm32

    电子发烧友网站提供《Core 3399 JD4文件系统Linux根文件系统镜像(arm64&arm32).txt》资料免费下载
    发表于 09-02 09:37 1次下载
    Core 3399 JD4文件系统<b class='flag-5'>Linux</b>根文件系统镜像(<b class='flag-5'>arm64</b>&<b class='flag-5'>arm32</b>)

    Core 3399KJ Linux根文件系统镜像(arm64/arm32

    电子发烧友网站提供《Core 3399KJ Linux根文件系统镜像(arm64/arm32).txt》资料免费下载
    发表于 09-14 10:08 3次下载
    Core 3399KJ <b class='flag-5'>Linux</b>根文件系统镜像(<b class='flag-5'>arm64</b>/<b class='flag-5'>arm32</b>)

    Core 3399J Linux根文件系统镜像(arm64/arm32

    电子发烧友网站提供《Core 3399J Linux根文件系统镜像(arm64/arm32).txt》资料免费下载
    发表于 09-14 09:24 0次下载
    Core 3399J <b class='flag-5'>Linux</b>根文件系统镜像(<b class='flag-5'>arm64</b>/<b class='flag-5'>arm32</b>)

    Core 3399 JD4 V2文件系统Linux根文件系统镜像(arm64/arm32

    电子发烧友网站提供《Core 3399 JD4 V2文件系统Linux根文件系统镜像(arm64/arm32).txt》资料免费下载
    发表于 09-16 09:44 10次下载
    Core 3399 JD4 V2文件系统<b class='flag-5'>Linux</b>根文件系统镜像(<b class='flag-5'>arm64</b>/<b class='flag-5'>arm32</b>)

    ROC RK3399 PC Pro文件系统Linux根文件系统镜像(arm64/arm32

    电子发烧友网站提供《ROC RK3399 PC Pro文件系统Linux根文件系统镜像(arm64/arm32).txt》资料免费下载
    发表于 09-20 10:59 5次下载
    ROC RK3399 PC Pro文件系统<b class='flag-5'>Linux</b>根文件系统镜像(<b class='flag-5'>arm64</b>/<b class='flag-5'>arm32</b>)

    AIO 3399ProC Linux根文件系统镜像(arm64/arm32

    电子发烧友网站提供《AIO 3399ProC Linux根文件系统镜像(arm64/arm32).txt》资料免费下载
    发表于 09-21 09:52 11次下载
    AIO 3399ProC <b class='flag-5'>Linux</b>根文件系统镜像(<b class='flag-5'>arm64</b>/<b class='flag-5'>arm32</b>)

    梯形丝杆和滚珠丝杆的区别在哪里

    梯形丝杆和滚珠丝杆的区别在哪里
    的头像 发表于 03-28 17:48 2399次阅读
    梯形丝杆和滚珠丝杆的<b class='flag-5'>区别在哪里</b>?

    ARM64位与ARM32位OP-TEE启动过程的差异

    ARM32的OP-TEE与ARM64的OP-TEE启动过程大致相同。ARM64的OP-TEE的_start函数定义在generic_entry_a64.S文件中,而且该函数不像
    的头像 发表于 11-07 15:12 765次阅读