コンテキスト:2.6.11カーネルを使用する「Linuxカーネルの理解、3ded」を読んでいます。
質問:私が理解しているように、物理アドレスは、論理アドレスを変換することによって取得される線形アドレスを変換することによって取得されます。論理アドレスは、説明テーブルでセグメントを識別するセグメントセレクターで構成されます。
Linuxグローバルディスクリプタテーブルには、他のセグメントの中でも、ユーザーコードとデータセグメントが含まれています。ただし、両方のセグメントのベースアドレスは0x0
であり、サイズも同じです。したがって、それらは完全に重なります。したがって、私が理解しているように、論理アドレスcs + offset
は論理アドレスds + offset
と同じです。ここで、cs
とds
は、それぞれコードセグメントセレクターを保持するCPUレジスタです。およびデータセグメントセレクタ。これは、両方のセグメントが同じベースアドレスを持っているためだと思います。ベースアドレスは、線形アドレスを取得するためにオフセットでインクリメントされます。
これが当てはまり、両方が同じ線形アドレスにマップされる場合、それらは同じ物理アドレスにもマップされませんか?もしそうなら、別々のcs
とds
レジスタを持つことの使用は何ですか?
セグメンテーションレジスタは、プロセッサがアドレス指定できるすべてのメモリをアドレス指定するのにoffset
が十分に大きくなかった、x86プロセッサの初期の時代からの遺産です。元の 8086 には20ビットのアドレス空間がありましたが、16ビットのオフセットしか使用できませんでした。セグメントレジスタを使用して、1024KBのアドレス空間の64KBを指定する必要がありました。セグメントレジスタは事実上20ビットレジスタであり、下位4ビットは強制的に0になりました。セグメントレジスタをロードすると、レジスタの上位16ビットが設定されます。これによりsegment + offset
20ビットのアドレス空間全体をカバーします。
セグメントレジスタはまだ存在しますが、Linuxはそれらを0に設定して、存在しないふりをすることができます。最新のx86プロセッサ( 80386 以降を意味します)は、すべてのアドレス空間をカバーするのに十分な大きさのオフセットを使用できるため、メモリセグメンテーションは不要になります。詳細については、 x86メモリセグメンテーション および フラットメモリモデル をお読みください。