🤖
linux GSセグメントレジスタ
システムコールを追って、currentマクロを展開するとGSセグメントレジスタが出てきます。
GSセグメントレジスタがどのように使われているか見ていきます。
GSセグメントレジスタはCPUによって目的が決められているわけではありません。
OS側で使用方法を決めることができるようになっています。
linuxではCPU固有のメモリへのアクセスするために使われます。
x86_64 Linux カーネルは、システム コール用のカーネル空間スタックを取得する効率的な方法として GS レジスタを使用します。
GS レジスタは、CPU ごとの領域のベース アドレスを格納します。カーネル空間スタックを取得するには、entry_SYSCALL_64 で
movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
PER_CPU_VAR を展開すると、次のようになります。
movq %gs:cpu_current_top_of_stack, %rsp
というわけで次はPER_CPU_VARを見ていきます。
$grep "PER_CPU_VAR" * -r
Discussion