我正在挂钩我的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段注册...
但我不知道如何正确设置它。
有人可以给我建议吗?
提前谢谢。
答案 0 :(得分:0)
这不仅仅是FS和GS。
您应该在汇编程序中编写整个例程,而不是在C!
中在输入原始系统调用向量之前,必须注意存储和恢复所有寄存器。否则“printk”将修改(销毁!)EAX ......
对于DS,ES,FS和GS的正确值,您应该查看Linux的源代码。据我所知,不是FS和GS造成问题,但必须调整DS和ES的价值!