3

我的目标是让我自己的内核启动一个应用程序 cpu。它使用与linux 内核相同的机制:

  • 发送断言和电平触发的 init-IPI
  • 等待...
  • 发送置低和电平触发的 init-IPI
  • 等待...
  • 最多发送两个带有向量号的启动 IPI (0x40000 >> 12)(应用处理器的入口代码就在那里)

目前我只是对让它与 QEMU 一起工作感兴趣。不幸的是,0x40000应用程序 cpu 并没有跳转到,而是0x0cs寄存器设置为0x4000。(我用gdb检查过)。

英特尔多处理器规范(B.4.2) 解释说,如果目标处理器在 RESET 或 INIT 后立即停止,我注意到的行为是有效的。但这不应该也适用于linux内核的代码吗?它在 init-IPI 之后发送 startup-IPI。还是我误解了规范?

我该怎么做才能让应用程序处理器跳转到而0x000VV000不是寄存器设置为?我真的看不到,linux 在哪里做了改变行为的事情。0x0cs0xVV00

4

1 回答 1

4

看来我真的误解了规范:既然应用程序cpu是以实模式启动的,0x000VV000就相当于0xVV00:0x0000. ip仅在 16 位寄存器中无法表示地址。因此,需要代码段的段偏移量。

此外,使用 gdb 调试实模式代码相当复杂,因为它不考虑段偏移量。当需要查看蹦床在当前位置的反汇编代码时,需要计算物理位置:

x/20i $eip+0xVV000

这使得 gdb 打印接下来的 20 条指令0xVV00:$eip

于 2014-06-05T15:41:37.163 回答