저는 리눅스 커널을 이해하려고 시도하고 있으며 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'
초래한다. 문제는 단순히 구조체를 출력 대상으로 사용할 수 없다는 것입니다. 그렇지 않으면 어떻게해야합니까? 또한, 리소스 (내 발견에) 종류의 부족했기 때문에, 누구든지 좋은 자습서 또는 주제에 관한 책을 추천 수 있습니까?
감사합니다.
감사합니다. 나는 그것이 단순한 무엇인지 알았습니다. (나는 뚜껑과 sidt를 혼란스럽게 만들었습니다.) 내가이 일을 뒤로하고있는 것이 분명하다. 당신의 도움을 주셔서 감사합니다. – fromClouds