web-dev-qa-db-ja.com

ユーザースペースのLinuxプロセスはどのようにしてカーネルアドレスを参照できますか?

メルトダウンの特定の側面を理解する手助けをしたいと思います。

私の理解では、メルトダウンバグは、ユーザースペースのLinuxプロセスでカーネルメモリにアクセスするために使用できます(間接的に、タイミングサイドチャネルを介して)。 メルトダウンペーパー のリスト2は次のとおりです。

 1; rcx =カーネルアドレス
 2; rbx =プローブアレイ
 3再試行:
 4移動、バイト[rcx] 
 5 shl rax、0xc 
 6jz再試行
 7移動rbx、qword [rbx + rax] 

私が混乱しているのは、「カーネルアドレス」がユーザースペースプロセス内にどのように存在するかということです。ユーザースペースプロセスには、カーネルとは異なる独自のアドレススペースとメモリマッピングがありませんか?私の期待は、ユーザースペースプロセスでは、rcx内のアドレスが、カーネル内で変換されるアドレス以外のものに変換されることです。おそらく単なるエラー/セグメンテーション違反です。

Linuxのユーザースペースプロセスがカーネルアドレスを参照することはどのように可能ですか?

1
rain1

パフォーマンスの最適化として、カーネルメモリはアプリケーションのメモリ空間内にマッピングされました。ページは保護されていますが、ページテーブルは(KPTIの前に)マップされていたため、システムコールごとにメモリからロードする必要はありませんでした。これで、各システムコールで、カーネルページテーブルをロードするための追加のオーバーヘッドが発生します。

5
David