2
我掛鉤了我的x86 linux內核的IDT條目。 更具體地說,我連接了0x80的IDT條目,這是 系統調用中斷處理程序。x86 Linux IDT掛鉤
一切順利,如果我建立了我的鉤子處理函數如下
void my_handler(){
asm("leave\n"); // clean up stack
asm("push $0xc0504020\n"); push original handler's address
asm("ret\n");
}
但是,如果我加起來類似的printk(),電流 - > 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段寄存器... 但我不知道如何正確設置它。 有人可以給我建議嗎?
預先感謝您。
謝謝,事實證明我應該在調用任何內核函數(如printk或current-> pid)之前正確設置段選擇器,因爲它們引用FS,GS選擇器,並且在ISR開始時,它們仍然是用戶的選擇器。 – daehee