

高岡智則
年齢:33歳 性別:男性 職業:Webディレクター(兼ライティング・SNS運用担当) 居住地:東京都杉並区・永福町の1LDKマンション 出身地:神奈川県川崎市 身長:176cm 体系:細身〜普通(最近ちょっとお腹が気になる) 血液型:A型 誕生日:1992年11月20日 最終学歴:明治大学・情報コミュニケーション学部卒 通勤:京王井の頭線で渋谷まで(通勤20分) 家族構成:一人暮らし、実家には両親と2歳下の妹 恋愛事情:独身。彼女は2年いない(本人は「忙しいだけ」と言い張る)
セグメントレジスタとは
セグメントレジスタはCPUの内部にある 「場所を示す印」 のような役割を持つ特別なレジスタです。プログラムがどのメモリ範囲を参照してよいかを決める重要な仕組みの一部で、メモリの効率的な管理と安全性を保つために使われます。
現代の x86 アーキテクチャでは、代表的なセグメントレジスタとして CS、DS、ES、SS、FS、GS の六つがあります。それぞれの役割は少しずつ異なり、コード領域、データ領域、スタック領域、そして特定用途の領域を指すことが多いです。
セグメントとアドレスの成り立ち
昔のリアルモードでは、実アドレスはセグメント値を 16 bit 左にシフトしてオフセットと足し合わせることで決まりました。式にすると 実アドレス = セグメント値 << 4 + オフセット となり、同じオフセットでもセグメントを変えると別の場所を参照できます。
一方で現代のプロテクトモードでは、セグメント値は セレクタ と呼ばれ、GDT(Global Descriptor Table)または LDT(Local Descriptor Table)と呼ばれる特別な表に登録されている ディスクリプタ と結びつきます。ディスクリプタには base(基準アドレス)、limit(上限)、アクセス権が含まれており、実際のアドレスは base と offset を組み合わせて決まります。
セレクタとディスクリプタの関係
セレクタは 2 バイトの値で、インデックス、TI(GDT/LDT を選ぶ情報)、RPL(実行権限のレベル)を含みます。インデックスが大きいほどディスクリプタテーブルのエントリを指します。ディスクリプタには base、limit、アクセス権が格納され、オフセットが有効な範囲かどうかの検査にも使われます。
実用例と現代の状況
CS は命令を取り出す参照元、DS はデータ参照、SS はスタック領域、FS と GS は特定用途用に使われることが多いです。OS によっては FS/GS に スレッドローカルストレージ(TLS) の基底アドレスを割り当てることがあります。
64ビット時代とセグメンテーション
x86-64 ではセグメントは実用面でのアドレス決定に使われる頻度が減り、平坦なメモリ空間を前提に動くことが多くなりました。CS、DS、ES、SS のベースは通常 0 に近く、FS/GS のみが一部で非ゼロのベースを取る場合があります。とはいえ、過去の知識を全て捨てる必要はなく、仮想化やOSの実装、TLS などの特殊用途で依然として意味を持ちます。
まとめとポイント表
ポイント1:セグメントレジスタはアドレス計算を担う「仕組みの要」です。ポイント2:リアルモードとプロテクトモードでは使い方が異なります。ポイント3:現代の多くの環境では平坦なアドレス空間を使いますが、FS/GS のような特定用途には今も活躍します。
| セグメント名 | 役割 | 備考 |
|---|---|---|
| CS | コード領域の参照 | 命令フェッチに関わる |
| DS | データ領域の参照 | データ操作全般 |
| SS | スタック領域の参照 | 関数呼び出し時の退避など |
| ES | データ補助領域 | レガシー用途など |
| FS | 特定用途の域 | TLS など |
| GS | 特定用途の域 | TLS など |
このように、セグメントレジスタは昔から続く概念ですが、現代のパソコンでは「平坦なアドレス空間」を前提に動くことが多いです。とはいえ、OS設計者やシステムプログラマにとっては、セグメントとディスクリプタの仕組みを知ることが、低レベルのメモリ管理を理解するための重要な第一歩になります。
セグメントレジスタの同意語
- セグメントレジスタ
- x86アーキテクチャでセグメント参照に使うレジスタの総称。CS/DS/SS/ES/FS/GSを含む一群のレジスタです。
- セグメント・レジスタ
- セグメントレジスタと同義。表記の違いだけの呼び方です。
- CSレジスタ
- コードセグメントを参照するレジスタ。命令コードが格納されているセグメントを指します。
- CS(コードセグメントレジスタ)
- CSの別名表現。コードセグメントを参照するレジスタを意味します。
- DSレジスタ
- データセグメントを参照するレジスタ。データ領域の位置を決定します。
- DS(データセグメントレジスタ)
- DSの正式名称の説明表現。データセグメントを指します。
- SSレジスタ
- スタックセグメントを参照するレジスタ。スタック領域の位置を決定します。
- SS(スタックセグメントレジスタ)
- SSの別名表現。スタック領域を参照するレジスタを意味します。
- ESレジスタ
- 追加セグメントを参照するレジスタ。ESを使って追加のセグメントを参照します。
- FSレジスタ
- 追加セグメントを参照するレジスタ。FSは特定のOSや用途でよく用いられます。
- GSレジスタ
- 追加セグメントを参照するレジスタ。GSは別の追加セグメントを指すことがあります。
- コードセグメントレジスタ
- CSと同義。コードセグメントを参照するレジスタの表現です。
- データセグメントレジスタ
- DSと同義。データセグメントを参照するレジスタの表現です。
- 追加セグメントレジスタ
- ES/FS/GSの総称で、追加のセグメントを参照するレジスタ群を指します。
- 拡張セグメントレジスタ
- ES/FS/GSをまとめて指す表現。追加セグメントを一括して表します。
セグメントレジスタの対義語・反対語
- フラットメモリ空間
- セグメントを使わず、アドレス空間を1つの連続体として扱う設計。初心者向けには“分割されていない空間”というイメージ。
- 全体アドレス空間
- メモリ全体を1つの大きなアドレス領域として扱う発想。セグメント分割の対極に位置する考え方。
- 連続アドレス空間
- アドレスが途切れず連続している状態のこと。セグメントの分割を前提としないイメージの対比として使える。
- オフセットレジスタ
- 仮想的な名称。セグメントレジスタがセグメントを決めるのに対し、こちらはアドレスのオフセット部分を扱う想定のレジスタ。実装上は存在しませんが、対比として分かりやすい。
- ベースレジスタ
- アドレス計算の起点となる基準値を保持するレジスタ。セグメントレジスタとは別の参照手段として対比に使える。
- ページング
- 別のメモリ管理方式で、セグメント化とは異なる方法でメモリを管理する考え方。対義語として挙げられることがある。
- セグメントなしモード
- 段階的なセグメント機構を使用しない動作モード。フラットなアドレス空間の理解を補助する表現として使える。
セグメントレジスタの共起語
- セグメントレジスタ
- CPUがどのセグメントを使うかを示す一連のレジスタの総称。CS・DS・ES・SS・FS・GSなどが含まれ、各セグメントのセレクタ値を格納します。
- CSレジスタ
- コードセグメントを指すセグメントレジスタ。現在実行中のコードセグメントを特定するためのセレクタ値を格納します。
- DSレジスタ
- データセグメントを指すセグメントレジスタ。データを格納・参照する領域のセレクタ値を格納します。
- ESレジスタ
- 追加データセグメントを指すセグメントレジスタ。補助的なデータ領域を指定します。
- SSレジスタ
- スタックセグメントを指すセグメントレジスタ。スタック操作の対象となる領域を決定します。
- FSレジスタ
- 追加データセグメントを指すセグメントレジスタ。OSやアプリの特定用途で使われることがあります。
- GSレジスタ
- 追加データセグメントを指すセグメントレジスタ。用途は環境依存で多様です。
- セグメントセレクタ
- セグメントを指す値で、GDT/LDTのディスクリプタエントリを指定します。RPL・TIを含む構造を持ちます。
- ディスクリプタ
- セグメントの属性をまとめた情報。ベースアドレス、リミット、アクセス権などを含みます。
- ディスクリプタテーブル
- ディスクリプタを格納する表の総称。主なものにGDTとLDTがあります。
- GDT
- Global Descriptor Table。システム全体のセグメント情報を格納するディスクリプタ表です。
- LDT
- Local Descriptor Table。プロセスごとに異なるセグメント情報を格納する表です。
- GDTR
- Global Descriptor Table Register。GDTの基底アドレスとサイズをCPUに伝えるレジスタです。
- LDTR
- Local Descriptor Table Register。LDTの基底アドレスとサイズをCPUに伝えるレジスタです。
- ベースアドレス
- セグメントの実際の開始アドレス。メモリ上の基点となります。
- リミット
- セグメントの上限サイズ。どこまでメモリを参照できるかを決定します。
- グラニュラリティ
- リミットの単位(バイトかページなど)を決める設定。複合的なサイズ解釈を行います。
- アクセス権
- セグメントへの読み/書き/実行の権限と、特権レベルを決定する属性です。
- アクセスバイト
- ディスクリプタ内のアクセス情報を表すビット列。読み/書き/実行とDPLを含みます。
- DPL
- Descriptor Privilege Level。ディスクリプタの許可レベルを示す値です。
- CPL
- Current Privilege Level。CPUが現在の実行権限レベルを示します。
- RPL
- Requested Privilege Level。セレクタの低位2ビットに格納される要求権限レベルです。
- TI
- Table Indicator。セレクタがGDTかLDTかを示すビットです。
- セグメントオフセット
- セグメント内のデータ位置を指すオフセット。実際のアドレス計算に使われます。
- セレクタの構造
- セレクタは インデックス / TI / RPL の3つの部分から成り立っています。
セグメントレジスタの関連用語
- セグメントレジスタ
- x86アーキテクチャにおいて、セグメントを参照するために使う16ビットのレジスタ。CS・DS・ES・SS・FS・GS の6つがあり、現在実行中の命令やデータの場所を指示する。
- CS(コードセグメントレジスタ)
- コードセグメントを参照するレジスタ。命令を読み込む際に使われ、ロードはジャンプ/リターンなどの制御転送で行われる(通常はMOVで直接書き換えない)。
- DS(データセグメントレジスタ)
- データセグメントを参照するレジスタ。データの参照/書き込みに使われるセグメントを指定する。
- ES(追加データセグメントレジスタ)
- 用途はデータの追加領域を指すセグメント。特定の命令セットやOS実装で使われることがある。
- SS(スタックセグメントレジスタ)
- スタック領域を指すセグメント。スタック操作(PUSH/POP)で基になるセグメントを指定する。
- FS(ファイル/局所データセグメント)
- 一部のOSでスレッド固有データなどを格納するセグメント。64ビットモードで特に重要な用途がある。
- GS(追加データセグメント)
- 多くの場合スレッド固有データ(TLS)や特定のOS機能のデータを格納するセグメントとして使われる。
- セグメントセレクタ
- セグメントレジスタに格納される16ビットの値。上位11ビットはインデックス、次の1ビットはTI、最低2ビットはRPLを表す。
- GDT(グローバルデスクリプタテーブル)
- グローバルに共有されるセグメントディスクリプタの集合。セグメントのベース・リミット・権限を定義する表。
- LDT(ローカルデスクリプタテーブル)
- プロセス/タスクごに割り当てられるセグメントディスクリプタの表。特定の用途に用いられることがある。
- デスクリプタ(セグメントディスクリプタ)
- セグメントの基底アドレス、リミット、アクセス権などを格納するデータ構造。セグメントレジスタはこれを参照して動く。
- ベースアドレス
- セグメントの開始地点となる線形アドレス。デスクリプタ内に格納される情報の一つ。
- リミット
- セグメントが参照可能な範囲を決める境界。リミットを超えるとアドレスエラーになる。
- アクセス権(アクセスビット)
- 読み取り/書き込み/実行の可否、特権レベル(ユーザー/カーネル)などを定義する属性群。
- Pビット( Present )
- セグメントがメモリ上に存在するかを示すビット。0の場合はページング時に無効になる。
- DPL(Descriptor Privilege Level)
- セグメントの許可される特権レベルを示す2ビット。カーネルとユーザーの境界を決める。
- RPL(Requested Privilege Level)
- 現在のセグメントレジスタが要求する特権レベルを示す2ビット。実行時の整合性に関わる。
- TI(Table Indicator)
- ディスクリプタテーブルがGDTかLDTかを示すビット。0ならGDT、1ならLDT。
- セグメントのロード/ストアの仕組み
- CSはジャンプ・呼び出し・リターンでロードされ、その他のレジスタはMOVで更新するのが一般的。
- 実モード/保護モード/ロングモード
- 実モードは段階的なセグメンテーション、保護モードでメモリ保護と仮想アドレス空間、ロングモードで64-bit長命令を提供する。
- フラットモデル
- セグメントをほぼ0ベースで統一し、線形アドレスを直接で扱う設計。現代OSで多く採用される。
- セグメントオーバーライドプリフィックス
- 命令中に別のセグメントを強制的に選択するためのプレフィックス。複雑なアドレシングを実現する。
- セグメント限界・境界
- セグメントの有効範囲を示すリミットの解釈。オフセットと組み合わせてアドレスを算出する。
- 長モードでのFS/GSの役割
- 64ビットモードでFS/GSは実行時にベースアドレスを持ち、TLSなどのデータを参照する基底として使われることが多い。
- MSRとセグメント基底設定
- FS_BASE/G S_BASEなどのMSRでFS/GSのベースアドレスを設定する仕組み。OSがTLS/スレッド情報へ高速にアクセスするのに使う。
- 線形アドレスと物理アドレスの関係
- セグメントベースとオフセットを組み合わせて線形アドレスを形成。実モードでは段階的に物理アドレスへ変換される。
- アセンブリでのセグメント参照の書き方
- セグメントレジスタを使う命令は特定の構文が必要。CSを直接書き換えることは通常不可で、ジャンプ/戻りで変更する。
- セグメントレジスタの用途と現代OSでの使い方
- 現代の多くはフラットモデルを採用し、FS/GSをTLSやスレッド情報の参照機能として活用するケースが多い。



















