2011-03-14 3 views
1

커널 모듈에 gate_desc *idt_table을 사용하려고합니다. desc.h에 정의 된 set_trap_gate() 함수는이 포인터를 사용합니다. desc.h에서 또한 정의 : extern gate_desc idt_table[]입니다. idt_table undefined! 커널 모듈을 컴파일 할 때 경고

  • idt_table 주소 나는 컴파일 또는 불완전한 유형 동안 id_table 정의되지 않은 경고 하나를 얻을 내 (유효)으로 idt_table에 영향을 미치는 정의 나 허식없이

    • 사용 idt_table 내 모듈 :

      나는 다른 것을 시도 idt_table입니다.

    • 예를 gate_desc *it = (gate_desc *)@;의 이름을 딴 새로운 VAR를 만들고 복사 set_trap_gate, set_gate, write_idt_entry, 내 모듈 파일로 sched.h에에서 pack_gate 기능 (그 이름을 변경하고, idt_table 대신에 그것을 사용). 이 잘 컴파일하지만 내 모듈을 삽입 할 때 모듈 (ret -1) 오류 알 수없는 기호가 나타납니다. (내 모듈에는 idt_table에 대한 참조가 없으며 sched에서 사용하는 함수는 내 변수를 사용합니다.)

    나는 sched.h에 의해 포함 된 파일에 idt_table을 정의 된 곳을보고했는데, 그것을 찾을 수 없습니다!

    누군가가 sched.h의 idt_table 포인터 (corrct 주소에 영향을 미침)를 사용하거나 새 포인터를 만들 수 있음을 알고 있습니까?

  • +0

    커널 모듈에서 이러한 종류의 작업을 수행하는 것은 안전하지 않습니다. 어쨌든 하나의 CPU 코어 만의 테이블을 수정하기 때문에 SMP 시스템에서 작동하지 않습니다 (공유 될 필요는 없습니다) . 커널 초기화는 커널 초기화에만 국한되어 있으므로 ('__init'으로 표시되어 있습니다). 성취하려고하는 것이 정확히 무엇입니까? –

    답변

    0

    이론적으로, 당신은을 통해 비 초기화 섹션 set_trap_gate()을 구현할 수 :

    void set_trap_gate(int n, void *addr) 
    { 
        struct { uint16_t lim; struct desc_struct *idt_table; } 
         __attribute__((packed)) idt; 
        __asm__ ("sidt %0" : : "m"(idt) : "memory"); 
        _set_gate(idt.idt_table + n, 15, 0, addr); 
    } 
    

    그러나 그것은 즉, 다른 IDT을 수정할 보장 아니에요, CPU 로컬 것하지만 CPU의 하나는이다 계속 달리고있어. 또한 쓰기 보호 된 메모리가 손상 될 수 있습니다.

    달성하려는 목표는 무엇입니까?

    +0

    답변 해 주셔서 감사합니다. 사실 나는 desc_t에 제공된 set_trap_gate와 같은 함수를 사용하여 간단한 버전의 디버그 레지스터 루트킷 (학생으로서의 학업을 위해)을 구현하고자합니다. 이를 위해 idt의 INT1에서 do_debug 처리기를 대체해야합니다. – jerome

    관련 문제