从启动跟踪指令执行
Posted
技术标签:
【中文标题】从启动跟踪指令执行【英文标题】:Tracing instruction execution from startup 【发布时间】:2017-05-15 06:34:12 【问题描述】:我有点梦想编写自己的操作系统。虽然这可能永远不会实现,但我认为至少朝着这个目标努力可能是有趣和有教育意义的。我认为最好的方法是从弄清楚我自己的计算机的功能开始。为此,我下载了程序 RW-Everything,它向我展示了内存中的内容,以及 AMD 处理器程序员参考手册(全部 5 卷)。本质上,我的问题是 RW-Everything 所说的我的计算机所做的似乎与手册所说的应该做的不符。所以我想知道谁或哪里出了问题。
根据手册,处理器从 FFFFFFF0 开始。这里的说明是
90(无) 90(无) E9 23 F6 (jmp near -09DD) 去 FFFFFFF5 - 9DD = FFFFF618
现在在 FFFFF618 的说明是 发(cli) 30 C0 (xor al, al) E6 80(出 80,人) 66 8B E0 (mov esp, eax) 66 8B EA (mov ebp, edx) 66 BB 80 FD FF FF (mov ebx, FFFFFD80) 66 2E 0F 01 17 (lgdt cs:[edi])
现在这里的问题是cs基地址仍然是它的初始值FFFF0000,而edi仍然是它的初始值0。所以GDTR应该从FFFF0000开始加载6个字节。但是在这个位置是 FF 的海洋,这意味着 GDT 基地址设置为 FFFFFFFF,这是一个极不可能开始 GDT 的地址。那么......什么给了?我是不是在某个地方弄错了?
【问题讨论】:
66 2e 0f 01 17
应该被解码为lgdt cs:[bx]
上面有一个 66 前缀,因此操作数被覆盖为 32 位宽。这样做的效果是确保 GDTR 中的基指针被视为完整的 32 位线性地址,而不是 32 位线性地址,最高 8 位掩码为 0,有效地使其成为 24 位线性地址。 24 位线性地址是 286 的保留。
Michael Petch - 我很确定列表是 ax, cx, dx, bx, sp, bp, si, di。所以最后 3 位是 111 意味着它是 di。其他人可以确认一种或另一种方式吗?另外,我知道它是一个 32 位指针,这就是为什么我指出这意味着 GDT 基地址是 FFFFFFFF。我的猜测是,FFFF0000 处的 FF 之海毫无意义,并不意味着指向任何东西。我可以补充一点,未来的指令似乎会将处理器切换到保护模式,这在 IMO 中为时过早。
【参考方案1】:
您在 FFFFF618h 处反汇编并找到以下说明:
FA (cli)
30 C0 (xor al, al)
E6 80 (out 80, al)
66 8B E0 (mov esp, eax)
66 8B EA (mov ebp, edx)
66 BB 80 FD FF FF (mov ebx, FFFFFD80)
66 2E 0F 01 17 (lgdt cs:[edi])
我是不是在某个地方弄错了?
你的最后一行是错误的。因为在执行时 CPU 仍在实地址模式下运行,并且指令没有使用显式地址大小前缀(字节 67h)进行编码,因此正确的翻译是:
lgdt [cs:bx] ;An R/M field of 111 denotes [BX] in 16-bit addressing.
现在BX
寄存器在0FD80h初始化,所以你应该看看那里!
【讨论】:
您好,不确定您是否还在阅读本文,但只是想非常感谢您的回答。我误认为 66 适用于偏移寄存器的大小。即使在纠正了那个错误之后,我也很难找到 111 表示 BX 的位置。事实上,如果我仔细阅读手册,我会注意到 111 = rDI 适用于 32 位和 64 位寻址。手册没有明确排除 16 位寻址,我解释了 "r" 在 rDI 中承认这种可能性。我在附录中找到了 16 位寻址的清单。果然,看看 FD80,我发现了一个有效的(如果奇怪的话)GDT。所以只是想说声谢谢,不要让你继续认为你的帮助没有被注意到或没有被欣赏。以上是关于从启动跟踪指令执行的主要内容,如果未能解决你的问题,请参考以下文章