我正在运行 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: 并让 GDB 打印 %%ebx 引用的内存,它将显示移到那里的值,但程序在它的内存中找不到它。
有没有办法用 GDB 找出正确的段(基地址)?GDB 甚至能够处理分段吗?