2014-01-10 63 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 ... –