2013-10-16 44 views
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段寄存器... 但我不知道如何正確設置它。 有人可以給我建議嗎?

預先感謝您。

回答

0

它不僅是FS和GS。

你應該把整個程序寫在彙編程序中,而不是C中!

在輸入原始系統調用向量之前,必須注意所有寄存器都已存儲和恢復。否則「printk」會修改(銷燬!)EAX ...

對於DS,ES,FS和GS的正確值,您應該查看Linux的源代碼。據我所知,FS和GS不是一個問題,但DS和ES的價值必須適應!

+0

謝謝,事實證明我應該在調用任何內核函數(如printk或current-> pid)之前正確設置段選擇器,因爲它們引用FS,GS選擇器,並且在ISR開始時,它們仍然是用戶的選擇器。 – daehee