我正在使用PTrace为ARM64编写一个基本的检查点机制,为此,我使用了一些来自cryopid的代码,并且我找到了一个如下所示的TRAMPOLINE_ADDR宏:
#define TRAMPOLINE_ADDR 0x00800000 /* 8MB mark */ for x86
#define TRAMPOLINE_ADDR 0x00300000 /* 3MB mark */ for x86_64所以当我读到关于跳床的时候,它是与跳跃语句相关的。但我的问题是,上述价值从何而来,ARM和ARM64平台的相应价值是什么。
谢谢
发布于 2016-01-14 11:11:32
只要看看维基百科的页面就知道了。
有没有什么神奇的弹床,当然是一个特定的地址,任何地址,你可以执行的代码,可以举行弹床。them...for示例有很多用例
假设您正在从闪存启动,spi闪存以某种安全速率运行,以便所有用户都可以启动芯片。但是您想要增加spi闪存的速率,并且spi外设不允许您在执行代码时进行更改。因此,您可以将一些代码复制到ram中,这些代码会将spi闪存速率提高到更快的速率,以便您可以更快地使用和/或运行闪存,然后从闪存中恢复运行。你已经从ram中的那一小段代码中跳出来了。
你有一个从闪存启动的芯片,但是有能力将地址空间重新映射到内存,例如,你将一些代码复制到其他内存,分支到它,这一小块跳床代码重新映射地址空间,然后将你弹回或弹跳到闪存现在映射到的地方或其他任何地方。
你会看到gnu链接器有时会添加一个小的trampoline,比如你将一些模块编译为thumb,另一些模块编译为arm,你不再需要使用这种互通的东西,链接器会负责清理,它可能会添加一条或两条指令来在不同的模式之间跳跃你,有时它会修改代码,只需要去它需要的地方,有时它会修改代码,使其分支链接到某个接近的地方,而靠近的地方是一个弹床。
我假设如果/当切换到aarch64模式时,可能需要对该模式做同样的事情。
所以不应该有魔法。你的特定应用程序可能有一个或多个跳床,而你感兴趣的那个甚至可能不会被调用,但可能是特定于应用程序的,绝对没有理由每个人都有一个地址,除非它是一些非常严格的操作特定的(也是“应用程序特定的”)事情,并且该操作系统的一个特定的跳床位于某个DEFINEd地址。
https://stackoverflow.com/questions/34780654
复制相似问题