我正在连接我的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段注册.但我不知道怎么把它设置好。有人能给我建议吗?
提前谢谢你。
发布于 2013-10-16 15:46:04
不仅仅是FS和GS。
您应该用汇编程序而不是用C编写整个例程!
在输入原始系统调用向量之前,必须注意存储和还原所有寄存器。否则"printk“将修改(销毁!)艾克斯..。
要获得DS、ES、FS和GS的正确值,您应该查看Linux的源代码。据我所知,造成问题的不是FS和GS,而是DS和ES的值必须加以调整!
https://stackoverflow.com/questions/19403490
复制相似问题