2012-10-16 35 views
4

最近我參加了幾個採訪。在所有被問到的核心問題中,有一個具體問題我找不到令人信服的答案。用戶空間進程和中斷上下文代碼之間的同步

在用戶空間進程和中斷上下文函數之間共享數據時,您將如何使用不同的同步技術?我有說服力的回答是:

在中斷上下文代碼:

1. do *spin_lock_irqsave* 
2. access data buffer which is shared between user space app and kernel 
3. do *spin_lock_irqrestore* 

那麼這是不能令人信服的答案。在所有數據訪問實例中,我必須執行irqsaveirqrestore嗎?

回答

2

您不能直接將數據從中斷上下文傳輸到用戶空間上下文。在中斷過程中沒有過程信息,所以你不知道在哪裏發送數據。您需要使用內核空間中的中間進程上下文。

現在,回答這個問題。在您的設備數據中,您將擁有一個緩衝區,您將在其中存儲來自中斷環境的數據。你需要使用自旋鎖保護你的數據,但沒有irqsave/irqrestore部分。因爲你處於中斷環境。

然後,您的設備將爲用戶空間提供一種獲取此數據的方式。您可以通過一個字符設備或一個netlink套接字或一個ioctl調用或任何其他方法來決定。當用戶空間需要這些數據時,您將memcpy從設備緩衝區中移到用戶空間緩衝區。但是,您將使用spin_lock_irqsave/spin_lock_irqrestore對保護設備緩衝區,因爲您不希望中斷代碼發生死鎖。

當用戶空間使用上述方法之一(char設備read,netlink socket,ioctl調用...)時,內核負責提供鎖定機制,但用於用戶空間和進程之間的接口。

相關問題