🤖

linux GSセグメントレジスタ

2022/09/29に公開

システムコールを追って、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