【linux】【retpoline】retpoline技術分析
最新
01-20
前言:
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_
eg
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中,就不會被用戶的指令預執行而竊取內核的數據。
TAG:AlwaysGeek |