x86 Linux IDT挂钩

时间:2013-10-16 12:30:46

标签: linux x86 interrupt

我正在挂钩我的x86 linux内核的IDT条目。 更具体地说,我挂了第0x80个IDT条目 系统调用中断处理程序。

如果我设置我的挂钩处理程序功能,一切顺利

void my_handler(){
    asm("leave\n");  // clean up stack
    asm("push $0xc0504020\n"); push original handler's address
    asm("ret\n");
}

但是,如果我添加像printk(),current-> pid ......

这样的东西
void my_handler(){
    printk("pid : %d\n", current->pid);
    asm("leave\n");  // clean up stack
    asm("push $0xc0504020\n"); push original handler's address
    asm("ret\n");
}
一切都冻结了。 我想这是因为我没有正确设置fs或gs段注册... 但我不知道如何正确设置它。 有人可以给我建议吗?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

这不仅仅是FS和GS。

您应该在汇编程序中编写整个例程,而不是在C!

在输入原始系统调用向量之前,必须注意存储和恢复所有寄存器。否则“printk”将修改(销毁!)EAX ......

对于DS,ES,FS和GS的正确值,您应该查看Linux的源代码。据我所知,不是FS和GS造成问题,但必须调整DS和ES的价值!