質問

クイックサマリー:x86-64モードでは、x86-32モードと同じくらい遅いジャンプですか?

X86プロセッサでは、ジャンプは3つのタイプに分類されます。

  • 短い、+/- 127バイトのPCオフセット(2バイト命令)
  • 近くでは、現在のセグメント(3バイト命令)を「転がす」+/- 32Kオフセットで
  • 遠く、どこにでもジャンプすることができます(5バイト命令)

短いジャンプと近くのジャンプは1〜2クロックサイクルになりますが、プロセッサに応じてジャンプは50〜80クロックサイクルになります。ドキュメントを読んだことから、これは「現在のコードセグメントであるCSの外に出る」ためです。

x86-64モードでは、コードセグメントは使用されていません - セグメントは事実上常に0.infinityです。エルゴ、セグメントの外に出ることに対してペナルティはないはずです。

したがって、質問:プロセッサがx86-64モードにある場合、クロックサイクルの数は遠いジャンプのために変化しますか?

関連ボーナスの質問:32ビット保護モードで実行されるほとんどの *nixのようなオペレーティングシステムは、セグメントサイズを0 ..インフィニティに明示的に設定し、ページテーブルを介して直線 - >物理変換を完全に管理します。彼らは、遠い呼び出しの時間(クロックサイクルが少ない)という点でこれから利益を得ていますか、それともペナルティは実際にサイズセグメントレジスタからの内部CPUの遺産であり、8086以降でしたか?

役に立ちましたか?

解決

CSは、ベースと制限だけでなく、権限にも使用されます。 CPLはそこにエンコードされ、次のような他のフィールドがエンコードされます。

  • Dビット-32ビットまたは16ビットのデフォルトセグメントサイズ
  • l-bit-セグメントの互換性または64ビットモードを選択します(この場合、ベースと制限は重要です)

Far Jumpsはタスクゲートを通過することもでき、Far Callはコールゲートを通過することもできます。これらはすべて、64ビットモードに関係なく処理する必要があります。

要約すると、64ビットモードでの遠いジャンプは、32ビットモードよりも高速ではありません。実際、64ビットモードが有効になっている場合、セグメント記述子は64ビットモードが無効になっている場合の2倍の大きさであることを考慮すると、すべての記述子テーブルアクセスが2倍になり、ジャンプの時間が長くなる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top