2010-05-16 37 views
0

我試圖在2.4 Linux內核(作業)上實現用戶線程,上下文切換的竅門似乎是使用每隔x毫秒關閉一次的報警,並將我們發送到一個報警處理程序,從中我們可以將longjmp下一個線程。我遇到的困難是如何保存環境以便稍後返回。當警報消失時警報處理程序關閉之前保存環境的最佳方法是什麼?

基本上我有一個jmp_buffs數組,每次使用警報發生「上下文切換」時,我都希望將前一個上下文保存到數組的相應條目中,並將longjmp保存到下一個上下文中。然而,事實上,我需要從事件處理程序執行此操作,這意味着在事件處理程序中使用setjmp不會給我完全所需的環境類型(只要涉及到堆棧和程序計數器),因爲堆棧有事件處理程序調用它並且pc在事件處理程序中。

我想我可以看看堆棧並改變它以適應我的需要,但是這感覺有點麻煩。另一個想法是在跳轉到事件處理程序之前以某種方式傳遞環境作爲事件處理程序的參數,但我無法弄清楚這是否可行。

所以我想我的問題是 - 我該如何做到這一點?

回答

1

你應該能夠只是像做:

if (setjmp(&from_thread)) 
    return; 
else 
    longjmp(&dest_thread, 1); 

在事件處理程序。當然,這意味着它會重新回到事件處理程序的線程中 - 但這沒關係,因爲那樣你就會直接從return開始,所以當事件處理程序觸發時它會返回到線程所在的位置。

(當然這假設你已經爲線程設置了單獨的堆棧)。