前言: Intel CPU的Spectre问题,在linux-upstream上有了一个叫做retpoline的解决方案。 本文选择系统调用的变化以及调用过程来分析,retpoline到底做了什么。 分析: 1,syscall linux-upstream/arch/x86/entry/entry_64.S中,
如果没有使用retpoline的话,直接根据syscall的nr调用对应的handler。 如果使用了retpoline,会进入__x86_indirect_thunk_rax的函数。 2,__x86_indirect_thunk_\reg linux-upstream/arch/x86/lib/retpoline.S中:
这里是宏嵌套实现的,生成了__x86_indirect_thunk_rax,__x86_indirect_thunk_rbx...__x86_indirect_thunk_r15。它们的实现都是使用JMP_NOSPEC。 3,JMP_NOSPEC inux-upstream/arch/x86/include/asm/nospec-branch.h中:
JMP_NOSPEC依然是宏嵌套。如果没有使用retpoline的话,直接调用函数。以__x86_indirect_thunk_rax为例,就是直接jmp到*rax,相当于系统调用直接call下来了。 如果使用retpoline的话,还需要继续展开宏JMP_NOSPEC。
在代码中插入了一个无限循环,而且并不会执行到。代码加载之后,CPU预执行的时候,预测分支走进trap中,就不会被用户的指令预执行而窃取内核的数据。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有