2015-12-14 30 views
1

我在製作一個仿真驅動程序,要求我在ATOMIC上下文中調用schedule()以使仿真部分正常工作。現在我有這樣的黑客,讓我打電話給schedule()內ATOMIC(例如環形鎖)背景:在Linux IRQ中調用schedule()

int p_count = current_thread_info()->preempt_count; 

current_thread_info()->preempt_count = 0; 
schedule(); 
current_thread_info()->preempt_count = p_count; 

但是,這並不在裏面工作的IRQ,該系統只是停止AFER調用schedule()

有沒有辦法破解內核的方式讓我做到這一點?我使用的是Linux內核4.2.1用戶模式Linux

回答

5

在內核代碼,你可以是在中斷上下文進程上下文。 當您處於中斷環境時,您無法調用任何阻止功能(例如,schedule())或訪問current指針。這與內核的設計方式有關,並且在中斷環境中沒有這種功能。另見this answer

根據你的目的,你可以找到一些策略,讓你達到你的目標。對我來說,聽起來很奇怪,你必須明確地調用schedule(),而不要依賴自然內核流。

下面是一種可能的方法(但是,這又取決於您的具體目標)。形成IRQ,您可以安排work queueschedule_work()之間的工作。事實上,工作隊列通過設計在進程上下文中執行內核代碼。從那裏,您可以調用阻塞功能並訪問當前的過程數據。