2014-10-06 60 views
0

我開始之前,這裏所說的運行@ RING0(內核模式)的所有代碼 - OSX 10.9:怪異的行爲 - 讓GDT @聯彙編

以下功能崩潰:

UINT64 GetGdtBase() 
{ 
    UINT64 gdt = 0; 
    asm("sgdt %0\n" ::"m"(gdt)); 
    return gdt >> 16; 
} 

以下功能FINE運行:

UINT64 GetGdtBase(UINT64* result) 
{ 
    asm("sgdt %0\n" ::"m"(*result)); 
    *result >>= 16; 
    return *result; 
} 

EHM,它看起來有點滑稽&怪我,但也許你們會發現,我在這裏做了什麼。

很想聽到一些建議。

感謝

+1

1.第二個版本是否在沒有崩潰的意義上運行良好,或者在做你期望的意義上運行? 2.如果我正確理解'asm ::',它希望在第二個輸入地址之後輸入地址,所以'gdt'或'* result'是輸入而不是結果。如果是這樣,你不想要一個':'來表示一個結果地址嗎? – Steve 2014-10-06 09:33:38

+0

感覺不崩潰。第一個崩潰 – Rouki 2014-10-06 10:04:57

回答

3

在長模式(64位代碼)的指令sgdt存儲一個64位的「GDT的線性地址」和16位「GDT極限」。這佔用了10個字節,並且不適合UINT64。

對於你的代碼的第一個版本,你會摧毀堆棧。很可能會破壞函數的返回地址並導致崩潰。

對於你的代碼的第二個版本,你仍然在搗毀某些東西;但無論如何,任何被丟棄的東西都可能不會被使用。

+0

這可能是它。謝謝。 – Rouki 2014-10-06 12:16:17