什么是ARM和ARM64的TRAMPOLINE_ADDR(aarch64)?

时间:2016-01-14 02:23:56

标签: linux-kernel arm computer-architecture

我正在为使用PTrace的ARM64编写一个基本的检查指向机制,为了这样做我使用了一些来自cryopid的代码,我找到了一个如下的TRAMPOLINE_ADDR宏:

#define TRAMPOLINE_ADDR     0x00800000   /* 8MB mark */ for x86
#define TRAMPOLINE_ADDR     0x00300000   /* 3MB mark */ for x86_64

因此,当我读到关于蹦床的内容时,它与跳转语句有关。但我的问题来自上述值的来源以及ARM和ARM64平台的相应值。

谢谢

1 个答案:

答案 0 :(得分:0)

只需阅读维基百科页面即可。

蹦床或某个特定地址没有任何魔力,任何可以执行代码的地址都可以容纳蹦床。它们有很多用例......例如

假设您正在启动闪存,spi闪存,以一定的安全速率运行,以便芯片为所有用户启动。但是你想增加spi flash的速率,spi外设不允许你在执行代码时改变。因此,您可以将一些代码复制到ram,该代码可以将spi闪存速率提高到更快的速度,这样您就可以更快地使用和/或运行闪存,然后从闪存中恢复运行。你已经在ram中弹出或蹦蹦了一小段代码。

你有一个从闪存引导的芯片,但是能够将该地址空间重新映射到ram,所以你将一些代码复制到其他某个ram,分支到它,一点点的trampoline代码重新映射地址空间,然后将你弹回或弹回你现在映射到的地方或其他任何地方。

你会看到gnu链接器有时会添加一个小蹦床,比如说你用拇指编译一些模块而另一些用于arm,你不再需要使用那个互通的东西,链接器负责清理它,它可能会添加一个或两个指令在模式之间蹦蹦跳跳,有时它会修改代码,只是去它需要的地方,有时它会修改代码到某个地方的分支链接,而某个地方就是蹦床。

我认为如果/当切换到该模式时,可能需要为aarch64做同样的事情。

所以应该没有魔力。你的特定应用程序可能有一个或多个蹦床,你感兴趣的那个可能甚至没有被调用,但可能是应用程序特定的,绝对没有理由为每个人都有一个地址,除非它是一些非常严格的操作特定(再次"应用程序特定")事物和该操作系统的一个特定蹦床位于某个DEFINEd地址。