私は POK を実行しており、POK はパーティション内で RTEMS を実行しています。システムは x86 セグメントを積極的に利用していますが、GDB にこれを考慮するように指示する方法がわかりません。
次のインライン asm コードを実行すると、EIP (コメントを参照) が正しい場所に配置されます。正しい SS (0x23) をロードし、この場所を gdb で確認すると、0x00000000 が表示されます。それを EAX にロードし直して、'info reg' で EAX をチェックすると、正しい EIP アドレスが表示されます。
"movl 56(%1), %%ebx \t\n" //move user esp address to register
"movl 60(%1), %%eax \t\n"
"movl %%eax , %%gs \t\n" // move user's SS to gs register
"movl 44(%1), %%eax \t\n" //move eip to register
"movl %%eax , %%gs:(%%ebx) \t\n" // move eip to user esp
%GS は GDT へのオフセットであるため、GDT を見つけてメモリ セグメントのベース アドレスを自分で再構築しようとしましたが、GDB も役に立ちませんでした。
%%gs: を省略し、%%ebx によって参照されるメモリを GDB に出力させると、そこに移動された値が表示されますが、プログラムはそのメモリ内でそれを見つけられません。
GDB で正しいセグメント (ベース アドレス) を見つける方法はありますか? GDB はセグメンテーションを処理することさえできますか?