2014-01-10 88 views
0

我正在尝试引导本地内核。我已经成功地转移处理器进入长模式,但随后QEMU报告下列指令三重故障:movq导致三重故障

movq %rax, ___stack_chk_guard(%rip)

为什么会movq原因三的错吗? (请张贴任何和所有的理论,我将与意见作出回应,如果他们不适用,或者如果我需要更多的信息。)

+0

如果发生“常规”异常(例如分段故障)并且您没有异常处理程序中断,则会发生双重故障和三重故障异常。这条指令发生的实际故障不是三重故障,而是一些其他故障(例如分段故障)。 –

回答

0

我能想到的下列可能性:

  1. 地址不是正确对齐(MOVQ大概需要64位对齐,这取决于你的处理器设置)

  2. 地址是无法访问的,但我想你知道数据是存在(特别是因为你使用%RIP)

+0

可能。 '__stack_chk_guard'爵士以独立于位置的方法引用在单独的C文件中定义的符号。我会对齐符号还是%rax的值,我该怎么做?另外,如何测试地址是否可访问? – wjk

+0

事实证明,可能性#1是正确的。解决了。 – wjk

+0

我很高兴它为你工作。要回答您的问题:要对齐符号,请使用汇编器中的.align或任何等效符号。要知道它是否对齐,如果你可以看看事情如何加载,那么你应该能够看到符号及其价值。然后确定值是否是1,2,4,8(我们的情况)的倍数,16 ... –