2011-03-14 88 views
1

我試圖在內核模塊中使用gate_desc *idt_table。 desc.h中定義的set_trap_gate()函數使用此指針。在desc.h中也是一個定義:extern gate_desc idt_table[]idt_table undefined!編譯內核模塊時出現警告

我嘗試不同的東西:

  • 使用idt_table我的模塊中沒有定義或做作
  • 影響idt_table我的(有效)idt_table地址 我得到編譯或不完全類型時成爲一個id_table未定義警告爲idt_table

  • 創建一個名爲例如gate_desc *it = (gate_desc *)@;新變種,並複製set_trap_gateset_gatewrite_idt_entry,從sched.h中我的模塊文件pack_gate功能(重命名它們,並使用它,而不是idt_table)。這編譯好,但是當插入我的模塊時,模塊(ret -1)錯誤中出現未知符號。 (在我的模塊中沒有idt_table的引用,而我在sched中使用的函數使用我的變量)。

我想看看如果由sched.h中包含的文件定義idt_table,但無法找到它!

有人知道我可以如何使用來自sched.h的idt_table指針(影響它與corrct地址)或創建一個新的指針嗎?

+0

從內核模塊執行這種操作並不安全,無論如何不會在SMP系統上工作,因爲您只需修改一個CPU內核的表(並且不一定保證共享) 。使用它僅限於內核初始化(這就是爲什麼它被標記爲'__init')。你究竟想要達到什麼目的? – 2011-03-15 11:38:37

回答

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); 
} 

但是,這會是CPU-地方,即它不能保證修改任何其他IDT但CPU的一個很正在運行。另外,它可能會受到寫保護記憶的限制。

你究竟想要達到什麼目的?

+0

謝謝你的回答。實際上,我想使用desc.h中提供的函數(如set_trap_gate)來實現調試註冊rootkit的簡單版本(作爲學生的學術工作)。爲此,我需要在idt中替換INT1中的do_debug處理程序 – jerome 2011-03-15 19:09:26