2012-04-14 31 views
0

我剛開始嘗試瞭解linux內核,並試圖找到IDTR的位置。它似乎像它應該是一個簡單的過程,因爲彙編語言提供lidt指令爲此目的。因此,我要覺得,我可以提供大到足以容納該寄存器的內容作爲輸出操作數,像這樣的結構:在內聯彙編中讀取非標準大小(IDTR)的寄存器(簡單?)

struct idt_ptr 
{ 
    unsigned short limit; 
    unsigned long long base; 
} __attribute__((packed)); 

struct idt_ptr idtp; 

int * get_idt() { 
    __asm__ 
    __volatile__(
     "lidt %0;" 
     : "=&r"(idtp) 
    ); 
} 

這不起作用的,當然。它導致

/var/folders/yb/ybzqw8850nz9lzjsc6jf9hkw0000gn/T//ccvNm3SA.s:11:suffix or operands invalid for `lidt' 

認爲該結構的大小是正確的,short應爲段地址16位和偏移long long 64位。問題只是我不能使用結構作爲輸出目標?否則我會怎麼做?此外,由於資源(對我的發現)一直稀缺,有誰能推薦一個關於這個主題的好教程或書籍嗎?

謝謝。

回答

2

這裏是在gcc內聯彙編中使用LIDTan example。請注意,LIDT將設置新值IDTR而不是讀取當前值。您應該使用SIDT來讀取IDTR。這裏有一個example如何在gcc的內聯彙編中做到這一點。

+0

謝謝,我知道這是簡單的事情(我把蓋茨和西德特混淆是有點尷尬)。很明顯,我正在向後推進。謝謝你的幫助。 – fromClouds 2012-04-15 23:16:14

相關問題