私はこの記事を読みました:http ://static.patater.com/gbaguy/day3pc.htm
文が含まれています
CSを変更しないでください!!
CS
しかし、セグメントレジスタを変更した場合、正確にはどうなるでしょうか。なんでそんなに危険なの?
私はこの記事を読みました:http ://static.patater.com/gbaguy/day3pc.htm
文が含まれています
CSを変更しないでください!!
CS
しかし、セグメントレジスタを変更した場合、正確にはどうなるでしょうか。なんでそんなに危険なの?
cs
コードセグメントです。cs:ip
、これは、(命令ポインタ)cs
とともにip
次の命令の場所を指すことを意味します。したがって、cs
またはip
両方に変更を加えると、次の命令がフェッチされて実行されるアドレスが変更されます。
通常、 (走り幅跳び)、(走り幅跳び) 、、、、またはで変更cs
します。8088および8086でも利用可能です(オペコード0x0F)。オペコード0x0Fがマルチバイト命令用に予約されている186以降では機能しません。 http://en.wikipedia.org/wiki/X86_instruction_listingsjmp
call
retf
int3
int
iret
pop cs
pop cs
走り幅跳びや走り幅跳びには本質的に危険なものは何もありません。ジャンプまたはコールする場所を知っている必要があります。プロテクトモードでは、それを実行するための十分な特権が必要です。16ビットリアルモード(DOSなど)では、ジャンプして、好きなアドレスに電話をかけることができます。BIOSコードの開始アドレスであるtoとtoにjmp 0xF000:0xFFF0
設定し、コンピュータを再起動します。異なるメモリアドレスは異なるコードを持っているため、異なる種類の結果を引き起こします。理論的には、可能な限りすべてが発生する可能性があります(ハードドライブのフォーマットに使用されるBIOSコードにジャンプすると、有効なレジスタやスタック値を使用して、ハードドライブがフォーマットされます。 「要求に応じて」)。実際にはcs
0xF000
ip
0xFFF0
jmp
call
ほとんどのアドレスへのは、おそらくすぐに無効なオペコードまたはその他の例外(ゼロ除算、オーバーフローの除算など)を引き起こす可能性があります。
プロテクトモードとロングモード(つまり16ビットモードではない)では、CSを含むセグメントレジスタはもはや単なる4ビットのアドレスではありません。それらは、ベース+制限(通常のベース=0制限=4GiB、つまりフラットメモリモデル)だけでなく、他の属性を使用して、セグメント記述子のテーブルにインデックスを付けます。
コードセグメント記述子は、CPUモードを決定します(たとえば、32ビット互換モードと64ビット長モード)。64ビットカーネルでは、64ビットのユーザースペースプロセスにより、far jmp
32ビットのコードが作成される可能性があります。これは実際には有用ではなく、コンテキストスイッチの後にOSがプロセスに戻ったときに壊れることさえあります。
TODO:誰かがこれを行う方法を示したリンクを掘り下げます。正しいセグメント番号を見つける方法についての詳細な回答とともに、これについての最近の質問さえあったと思います。