timer isr 加上 loop delay (0)
git version: 42f0e3c7c723e3d3fc5e0a3c7a4c19ab41a2a9d1
git branch: int_test
問題: qemu 直接 hang 住; bochs 則發出 invalid opcode exception。
在參考 Orange's 一個作業系統的實現, 將 timer isr 分成兩部份後, 想要測試中斷重入的問題, 所以加上 loop delay, 結果整個 process 切換出了問題, 靠著我的法寶, bochs 內建的 debugger, 還是無法找出問題, 先記錄在這裡。
在 qemu 執行不正常。
in bochs:
Invalid Opcode exception。
將中斷點設定在
總算可以中斷除錯了。
而問題發生在
這個 bug 修好之後又產生新問題。本來在 clock_handler 會一直印 @, 但最後會印 k, 連 process a, b, c 都無法切換, 真是奇怪, 更奇怪的是, 就當機了 ... 在 reenter 的部份看來還是有問題。
git branch: int_t0
找到問題了, 由於 delay 太長, 導致總是發生 reenter timer isr, 最後 kernel stack 爆掉, 所以會有奇怪的行為, 我加大 kernel stack 這問題變會延後發生。
將中斷點設定在
411 pushal
總算可以中斷除錯了。
而問題發生在
431 jne 1f # reenter我忘記加上 f 了, 導致重新進入中斷時, jmp 到絕對位址 1 (8:1)去了。
431 jne 1 # reenterhwint01 是鍵盤中斷, 我特地改到鍵盤中斷, 方便測試這個 bug。之前就猜測有可能是重新進入中斷時產生這問題。
這個 bug 修好之後又產生新問題。本來在 clock_handler 會一直印 @, 但最後會印 k, 連 process a, b, c 都無法切換, 真是奇怪, 更奇怪的是, 就當機了 ... 在 reenter 的部份看來還是有問題。
git branch: int_t0
找到問題了, 由於 delay 太長, 導致總是發生 reenter timer isr, 最後 kernel stack 爆掉, 所以會有奇怪的行為, 我加大 kernel stack 這問題變會延後發生。
以下的畫面下方的數字便是 reenter 的參考數字, 只有 0 時, 才能切換 process, 可以看到一開始還可以切換 process, 可是到最後數字變得越來越大, 已經無法再執行 proc A。
timer isr 加上 loop delay (1)
git version: 78dbca4590d33fccb2dbb581e4984cecb5d0732d
又是 timer isr 問題, 在改成類似 minix 的中斷處理架構後, 一樣要測試中斷重入的問題, 所以加上 loop delay, 結果整個 process 切換出了問題, 只有執行 timer isr, 無法切換 process。
loop delay 的參數為 100 才會有這樣的問題, 10 的話 process 可以正常切換。透過 bochs 內建的 debugger 之後, 發現執行到 process A 時, 會馬上跳回 timer isr code, 真是奇怪, 造成 process A 的程式碼都不會執行。
這問題看來是這樣:
若是 timer 1 秒發一次中斷, 而 timer isr 需要 2 秒才能做完, 便會有這樣的情形。
process 切換加上 system call get_ticks()
git version: e0e80522a112a3f96fc06d96ac45243a2dda685e ~ a2afffe6e81b567349233b80a59831595fc64b00^fixed: a2afffe6e81b567349233b80a59831595fc64b00
使用 milli_delay() (使用 get_ticks() system call), 很奇怪的又有無法切換 process 的問題, 只出現幾次的 process 切換後, 就只看到 timer interrupt 裡頭印出的字元, 可以看到中斷重入的現象。
我很害怕又是哪裡的切換 (ring0/ring1) 或是中斷沒處理好, 明明已經花了很多時間去了解/驗證了。不過最後的結果令我意外, 是很好解決也很明顯的 bug。
原來 processs a, b 卡在 milli_delay() loop 裡頭, 計算 timer tick 的變數我竟然只宣告成 u8, 造成離開 loop 的條件無法達成, 改成 u32 就沒問題了。
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。