7

私はこの記事を読みました:http ://static.patater.com/gbaguy/day3pc.htm

文が含まれています

CSを変更しないでください!!

CSしかし、セグメントレジスタを変更した場合、正確にはどうなるでしょうか。なんでそんなに危険なの?

4

2 に答える 2

8

csコードセグメントです。cs:ip、これは、(命令ポインタ)csとともにip次の命令の場所を指すことを意味します。したがって、csまたはip両方に変更を加えると、次の命令がフェッチされて実行されるアドレスが変更されます。

通常、 (走り幅跳び)、(走り幅跳び) 、、、、またはで変更csします。8088および8086でも利用可能です(オペコード0x0F)。オペコード0x0Fがマルチバイト命令用に予約されている186以降では機能しません。 http://en.wikipedia.org/wiki/X86_instruction_listingsjmpcallretfint3intiretpop cspop cs

走り幅跳びや走り幅跳びには本質的に危険なものは何もありません。ジャンプまたはコールする場所を知っている必要があります。プロテクトモードでは、それを実行するための十分な特権が必要です。16ビットリアルモード(DOSなど)では、ジャンプして、好きなアドレスに電話をかけることができます。BIOSコードの開始アドレスであるtoとtoにjmp 0xF000:0xFFF0設定し、コンピュータを再起動します。異なるメモリアドレスは異なるコードを持っているため、異なる種類の結果を引き起こします。理論的には、可能な限りすべてが発生する可能性があります(ハードドライブのフォーマットに使用されるBIOSコードにジャンプすると、有効なレジスタやスタック値を使用して、ハードドライブがフォーマットされます。 「要求に応じて」)。実際にはcs0xF000ip0xFFF0jmpcallほとんどのアドレスへのは、おそらくすぐに無効なオペコードまたはその他の例外(ゼロ除算、オーバーフローの除算など)を引き起こす可能性があります。

于 2012-09-04T13:27:45.377 に答える
-1

プロテクトモードとロングモード(つまり16ビットモードではない)では、CSを含むセグメントレジスタはもはや単なる4ビットのアドレスではありません。それらは、ベース+制限(通常のベース=0制限=4GiB、つまりフラットメモリモデル)だけでなく、他の属性を使用して、セグメント記述子のテーブルにインデックスを付けます。

コードセグメント記述子は、CPUモードを決定します(たとえば、32ビット互換モードと64ビット長モード)。64ビットカーネルでは、64ビットのユーザースペースプロセスにより、far jmp32ビットのコードが作成される可能性があります。これは実際には有用ではなく、コンテキストスイッチの後にOSがプロセスに戻ったときに壊れることさえあります。

TODO:誰かがこれを行う方法を示したリンクを掘り下げます。正しいセグメント番号を見つける方法についての詳細な回答とともに、これについての最近の質問さえあったと思います。

于 2016-09-07T23:50:01.347 に答える