2013-02-06 57 views
2

我正在嘗試創建一個具有結構的內核模塊&我想在用戶空間應用程序中使用相同的結構,並且此應用程序與給定模塊一起工作。在用戶空間應用程序中使用自旋鎖

主要問題是這個結構中包含一個名爲spinlock_t type的變量。它在內核中用於鎖定,但不知道如何在用戶空間應用程序中使用它。

struct new_struct 
{ 
    ...some variable... 
    spinlock_t u_lock; 
}; 

有什麼辦法在用戶空間應用程序中使用自旋鎖。

或者是否有任何其他鎖定技術可以在內核&用戶空間中使用,以便如果鎖由用戶應用程序保存,則內核模塊應該無法獲取它,反之亦然。

+0

您是否試圖將此結構傳遞給ioctl – doron

回答

4

我知道這個結構在內存中,它在內核和用戶進程之間共享。如果沒有,您可以使用ifdef KERNEL在內核和用戶空間中使用不同的鎖定。

但是,如果它是共享的,則不能在其上使用spinglocks,因爲不允許用戶空間阻塞內核。

處理該問題的簡單方法是獲取內核中的所有信息,並通過用戶空間代碼發出系統調用來訪問它。

另一種方法是使用無鎖數據結構(環形緩衝區很流行)進行此通信。

1

spinlooks是內核結構,不能在用戶空間中使用。 對於用戶空間來說,像pthread mutex這樣的互斥鎖是最好的選擇。

如果您希望相同的代碼也能在用戶空間和內核模式下工作,則需要使用ifdefs。 #ifdef KERNEL將允許您選擇,而您使用的鍵入。

您應該創建調用適當功能(spinlook或mutex)的包裝函數(可以是內聯函數)。並根據ifdefs編譯實際的實現。

0

最好的辦法是創建一個IOCTL接口來鎖定你的內核資源。我假設你的內核模塊向用戶空間公開了一個字符驅動程序接口。來自用戶空間的這個IOCTL調用將在調用時設置並重置內核螺旋鎖。您也可以使用相同的接口來檢查資源是否被內核鎖定。

1

內核螺旋鎖不適合用戶空間,因爲如果使用_irqsave/_irqrestore,它將禁用搶佔和禁用IRQ。 在用戶空間中甚至不可能搶佔或禁用IRQ。

我認爲最好的嘗試是pthread_spinlock。