2012-04-14 2 views
0

저는 리눅스 커널을 이해하려고 시도하고 있으며 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) 
    ); 
} 

이것은 물론 작동하지 않습니다 난과 같이, 출력 피연산자로이 레지스터의 내용을 수용 할 수있을만큼 큰 구조를 제공 할 수 있음을 따라서 생각합니다. 내가 구조체의 크기 short 세그먼트 어드레스 16 비트 오프셋 long long위한 64 비트를 제공해야 올바른 생각

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

초래한다. 문제는 단순히 구조체를 출력 대상으로 사용할 수 없다는 것입니다. 그렇지 않으면 어떻게해야합니까? 또한, 리소스 (내 발견에) 종류의 부족했기 때문에, 누구든지 좋은 자습서 또는 주제에 관한 책을 추천 수 있습니까?

감사합니다.

답변

2

여기 LIDT을 gcc 인라인 어셈블리에 사용하는 an example입니다. LIDT은 현재 값을 읽는 대신 IDTR의 새 값을 설정합니다. IDTR을 읽으려면 SIDT을 사용해야합니다. gcc로 인라인 어셈블리를 수행하는 방법은 example입니다.

+0

감사합니다. 나는 그것이 단순한 무엇인지 알았습니다. (나는 뚜껑과 sidt를 혼란스럽게 만들었습니다.) 내가이 일을 뒤로하고있는 것이 분명하다. 당신의 도움을 주셔서 감사합니다. – fromClouds