什么是ARM和ARM64的TRAMPOLINE_ADDR(aarch64)



我正在使用PTrace为ARM64编写一个基本的检查点机制,为了做到这一点,我使用了crypid中的一些代码,我发现了一个TRAMPOLINE_ADDR宏,如下所示:

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

所以当我读到关于蹦床的文章时,它与跳跃语句有关。但我的问题是,上述值来自哪里,ARM和ARM64平台的相应值是什么。

感谢

只需阅读维基百科页面。

蹦床没有什么神奇之处,当然也没有一个特定的地址,任何可以执行代码的地址都可以容纳蹦床。它们有很多用例。。。例如

假设你是从一个flash启动的,一个spi flash,以一定的安全速率运行,这样芯片就可以为所有用户启动。但是您想要增加spi闪存的速率,并且spi外围设备不允许您在执行代码时进行更改。因此,你可以将一些代码复制到ram中,该代码将spi闪存速率提高到更快的速率,这样你就可以更快地使用和/或运行闪存,然后从闪存中恢复运行。您已经跳出或践踏了ram中的那一点点代码。

你有一个从flash启动的芯片,但它能够将地址空间重新映射到ram,例如,所以你将一些代码复制到其他ram,分支到它,蹦床代码重新映射地址空间,然后将你弹回来,或者将你弹到flash现在映射到的位置,或者其他什么。

你会看到gnu链接器有时会添加一个小蹦床,比如你将一些模块编译为thumb,将另一些编译为arm,你不再需要使用这种相互作用的东西,链接器会负责清理它,它可能会在模式之间添加一两条指令来蹦床,有时它会修改代码,只去它需要的地方,有时它会将代码修改为在附近的某个地方分支链接,而在附近的地方是蹦床。

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

所以不应该有魔法。您的特定应用程序可能有一个或多个蹦床,您感兴趣的蹦床可能甚至不会被称为蹦床,但可能是特定于应用程序的,绝对没有理由为每个人都有一个地址,除非它是一些非常严格的特定操作(再次称为"特定应用程序")的东西,并且该操作系统的一个特定蹦床位于某个特定地址。

最新更新