簡體   English   中英

中斷處理程序中的異常行為

[英]strange behaviour in interrupt handler

我目前正在開發內核,並且在實現系統調用時遇到了一個神秘的問題。 我這樣寫0x80th中斷處理程序:

sys_call_s:
    pushad
    call sys_call
    popad
    iret

“ sys_call”是執行實際工作的C函數的名稱。 問題是:執行下一條“ int 0x80”指令時出現三重錯誤。 例如,執行下面程序的第三行時出現錯誤,最后bochs將重置自身。

abc: mov eax,0              ; 0 means system call get_pid()
     int 0x80
     mov [pid_father],eax   ; this is the instruction caused bochs to triple fault
     mov eax,1              ; 1: fork()
     int 0x80
     jmp $

pid_father:  dd 0

更令人吃驚的是,當我將“ iret”指令替換為“ ret”時,程序運行良好,並在“ jmp $”處旋轉。

有誰知道為什么我遇到這個問題?

[編輯]現在我認為此問題是由堆棧指針的地址錯誤引起的。 我已經為此過程映射了一個頁面,該頁面的物理地址是0x401000,線性地址是0x800000(8M)。 我已經將此進程的堆棧指針設置為0x800ff0,但是每次我在bochs中使用“ print-stack”命令時,輸出為:“物理地址不適用於線性0x00801000”。 我該如何解決?

[編輯]現在,我發現我無法在此過程中訪問數據。 例如,當我在“ int 0x80”之前放置“ mov [pid_father],eax”時,bochs會重置自身。 為什么會這樣?

我認為您需要顯示GDT和DS寄存器以及分頁表的內容。 如果您在該行上看到三重錯誤而沒有其余任何代碼,則意味着存在對[pid_father]的訪問。 數據段無效,或者頁面無效或標記為只讀,這導致GPF或頁面錯誤異常。 GPF或頁面錯誤異常發生故障(可能是出於相同的原因,或者是不同的原因),這導致了雙重錯誤異常,再次導致了三次故障並重置CPU。

Bochs通常(從內存中)非常擅長打印出故障原因。 您可能需要稍微向上滾動歷史記錄,然后查找所引發的第一個異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM