當前位置:
首頁 > 最新 > 【linux】【retpoline】retpoline技術分析

【linux】【retpoline】retpoline技術分析

前言:

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中,就不會被用戶的指令預執行而竊取內核的數據。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AlwaysGeek 的精彩文章:

TAG:AlwaysGeek |