2

我正在挂钩我的 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 段寄存器......但我不知道如何正确设置它。有人可以给我建议吗?

先感谢您。

4

1 回答 1

1

不仅仅是FS和GS。

您应该用汇编程序而不是 C 语言编写整个例程!

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

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

于 2013-10-16T15:46:04.740 回答