- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到的情况是某些地址空间很敏感,因为没有人响应该地址,因此您将其读取会崩溃。
pop {r3,pc}
bx r0
0: e8bd8008 pop {r3, pc}
4: e12fff10 bx r0
8: bd08 pop {r3, pc}
a: 4700 bx r0
unsigned int more_fun ( unsigned int );
unsigned int fun ( void )
{
return(more_fun(0x12344700)+1);
}
00000000 <fun>:
0: b510 push {r4, lr}
2: 4802 ldr r0, [pc, #8] ; (c <fun+0xc>)
4: f7ff fffe bl 0 <more_fun>
8: 3001 adds r0, #1
a: bd10 pop {r4, pc}
c: 12344700 eorsne r4, r4, #0, 14
-march=armv4t
00000000 <fun>:
0: b510 push {r4, lr}
2: 4803 ldr r0, [pc, #12] ; (10 <fun+0x10>)
4: f7ff fffe bl 0 <more_fun>
8: 3001 adds r0, #1
a: bc10 pop {r4}
c: bc02 pop {r1}
e: 4708 bx r1
10: 12344700 eorsne r4, r4, #0, 14
unsigned int more_fun ( unsigned int );
unsigned int fun ( void )
{
return(more_fun(0xe12fff10)+1);
}
00000000 <fun>:
0: e92d4010 push {r4, lr}
4: e59f0008 ldr r0, [pc, #8] ; 14 <fun+0x14>
8: ebfffffe bl 0 <more_fun>
c: e2800001 add r0, r0, #1
10: e8bd8010 pop {r4, pc}
14: e12fff10 bx r0
ldr pc,[something]
bx rn
最佳答案
https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html有一个-mpure-code
选项,该选项不会在代码段中放置常量。 “仅当使用MOVT指令为M轮廓目标生成非图片代码时,此选项才可用。”因此,它可能会使用一对mov立即指令而不是从常量池中加载常量。
但是,这不能完全解决您的问题,因为带有伪造的寄存器内容的常规指令的推测执行(在函数内部的条件分支之后)仍然可能触发对不可预测地址的访问。或仅仅是另一个功能的第一条指令可能是一个负载,因此陷入另一个功能也不总是安全的。
我可以尝试阐明为什么它如此晦涩难懂,以至于编译器还没有避免它。
通常,推测性执行错误指令不是问题。在变为非推测性之前,CPU不会真正处理该故障。错误的(或不存在的)分支预测可能会使CPU在找出正确的路径之前做一些缓慢的事情,但是永远不会存在正确性问题。
通常,大多数CPU设计都允许来自内存的推测性负载。但是显然必须保护具有MMIO寄存器的存储区。例如,在x86中,内存区域可以是WB(正常,可写回缓存,允许推测负载)或UC(不可缓存,没有推测负载)。更不用说写合并直写...
您可能需要类似的解决方案来解决您的正确性问题,以阻止推测性执行执行实际上会爆炸的事情。这包括由推测bx r0
触发的推测指令获取。 (很抱歉,我不了解ARM,所以我无法建议您如何做。
但这就是为什么即使大多数系统具有无法通过推测方式读取的MMIO寄存器,对于大多数系统来说,这只是一个较小的性能问题。)
我认为,有一种设置可以让CPU从使系统崩溃的地址中进行推测性负载,而不是仅当它们成为非推测性时引发异常,这是非常不寻常的。
在这种情况下,我们关闭了分支预测器
这就是为什么您总是看到投机执行超出了无条件分支(pop
)的原因,而不是很少见到的。
使用bx
返回的出色侦探工作,表明您的CPU在解码时检测到了这种无条件分支,但没有检查pc
中的pop
位。 :/
通常,分支预测必须在解码之前进行,以避免获取气泡。给定获取块的地址,请预测下一个块获取地址。预测也是在指令级别而不是提取块级别生成的,供内核的后续阶段使用(因为一个块中可以有多个分支指令,并且您需要知道采用哪个分支指令)。
那是通用理论。分支预测不是100%,因此您不能依靠它来解决您的正确性问题。
x86 CPU可能存在性能问题,其中间接jmp [mem]
或jmp reg
的默认预测是下一条指令。如果推测性执行启动了一些取消较慢的操作(例如某些CPU上的div
)或触发了缓慢的推测性内存访问或TLB未命中,则一旦确定正确的路径,它可能会延迟执行。
因此,建议(根据优化手册)在ud2
之后放置int3
(非法指令)或jmp reg
(调试陷阱)或类似内容。或更好的方法是,在其中放置一个跳转表目标,以便在某些时候“掉线”是正确的预测。 (如果BTB没有预测,则下一条指令是它唯一可以做的明智的选择。)
但是,x86通常不会将代码与数据混合在一起,因此,对于文字池很常见的体系结构,这更有可能成为问题。 (但伪造地址的负载仍然可能在间接分支或错误预测的正常分支之后进行推测性的发生。
例如if(address_good) { call table[address](); }
可能很容易预测错误并从错误的地址触发推测性代码获取。但是,如果最终的物理地址范围被标记为不可缓存,则加载请求将在内存控制器中停止,直到已知它是非推测性的
返回指令是一种间接分支,但是下一条指令的预测不太可能使用。那么也许bx lr
停滞不前是因为投机性下降不太可能有用吗?
在解码阶段未将pop {pc}
(又名来自堆栈指针的LDMIA
)检测为分支(如果未专门检查pc
位),或将其视为通用间接分支。当然,还有其他将ld
用作非返回分支的用例,因此将其检测为可能的返回将需要检查源寄存器编码以及pc
位。
也许有一个特殊的(内部隐藏的)返回地址预测变量堆栈,当与pc
配对时,有助于每次正确地预测bx lr
吗? x86这样做是为了预测bl
/ call
指令。
您是否测试过ret
是否比pop {r4, pc}
/ pop {r4, lr}
更有效?如果bx lr
的特殊处理不仅仅是避免推测性执行垃圾,那么最好让gcc这样做,而不是让它使用bx lr
指令或其他内容引导其文字池。
关于gcc - ARM预取解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46118893/
@Cacheable在同一类中方法调用无效 上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,
目录 @Transaction注解导致动态切换更改数据库失效 使用场景 遇到问题 解决 @Transaction
@RequestBody不能class类型匹配 在首次第一次尝试使用@RequestBody注解 开始加载字符串使用post提交(貌似只能post),加Json数据格式传输的时候,
目录 @Autowired注入static接口问题 @Autowired自动注入普通service很方便 但是如果注入static修饰的serv
目录 @RequestBody部分属性丢失 问题描述 JavaBean实现 Controller实现
目录 解决@PathVariable参数接收不完整的问题 今天遇到的问题是: 解决办法: @PathVariable接受的参
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。 如果你也出现了这种情况,可以从下面开始排查。 1、特性 先来了解一下@Trans
概述: ? 1
场景: 在处理定时任务时,由于这几个方法都是静态方法,在aop的切面中使用@Around注解,进行监控方法调用是否有异常。 发现aop没有生效。 代码如下:
最近做项目的时候 用户提出要上传大图片 一张图片有可能十几兆 本来用的第三方的上传控件 有限制图片上传大小的设置 以前设置的是2M&nb
我已经实现了这个SCIM reference code在我们的应用程序中。 我实现的代码确实通过了此postman link中存在的所有用户测试集合。 。我的 SCIM Api 也被 Azure 接受
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我正在尝试查找 channel 中的消息是否仍然存在,但是,我不确定如何解决 promise ,查看其他答案和文档,我可以看到它可能是通过函数实现的,但我是不完全确定如何去做。我希望能在这方面获得一些
我有以下情况: 同一工作区中的 2 个 Eclipse 项目:Apa 和 Bepa(为简洁起见,使用化名)。 Apa 项目引用(包括)Bepa 项目。 我在 Bepa 有一个类 X,具有公共(publ
这个问题已经有答案了: Why am I getting a NoClassDefFoundError in Java? (31 个回答) 已关闭 6 年前。 我正在努力学习 spring。所以我输入
我正在写一个小游戏,屏幕上有许多圆圈在移动。 我在两个线程中管理圈子,如下所示: public void run() { int stepCount = 0; int dx;
我在使用 Sympy 求解方程时遇到问题。当我运行代码时,例如: 打印(校正(10)) 我希望它打印一个数字 f。相反,它给我错误:执行中止。 def correction(r): from
好吧,我制作的每个页面都有这个问题。我不确定我做错了什么,但我所有的页面都不适用于所有分辨率。可能是因为我使用的是宽屏?大声笑我不确定,但在小于宽屏分辨率的情况下,它永远不会看起来正确。它的某些部分你
我正在尝试像这样进行一个非常简单的文化 srting 检查 if(culture.ToUpper() == "ES-ES" || "IT-IT") { //do something } else
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗?Upda
我是一名优秀的程序员,十分优秀!