2012-04-14 81 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